Cod sursa(job #253373)

Utilizator 630r63Ilinca George Mihai 630r63 Data 5 februarie 2009 18:33:18
Problema Plus Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.09 kb
 #include <stdio.h>  
   
 #define LL long long  
   
 int S;  
   
 int nr[5], s[5];  
   
 int nr0[5];  
   
 int a, sa, b, sb, e;  
   
 inline int MAX(int a, int b) { return (a > b) ? a : b; }  
 inline int MIN(int a, int b) { return (a < b) ? a : b; }  
   
 int nr_aleg(int S)  
 {  
     if (!e) {  
         if (S == 0) return 1;  
         if (S < 0 && sa < 0 && -S <= a) return 1;  
         if (S > 0 && sa > 0 && S <= a) return 1;  
   
         return 0;  
     }  
   
     if (sa > 0 && sb > 0) {  
         if (S == 0) return 1;  
         if (S < 0) return 0;  
   
         return MAX( MIN(S, a) - MAX(S - b, 0) + 1, 0 );  
     }  
   
     if (sa < 0 && sb < 0) {  
         if (S == 0) return 1;  
         if (S > 0) return 0;  
   
         return MAX( MIN(-S, a) - MAX(-S - b, 0) + 1, 0 );  
     }  
   
     return MAX( MIN(a, S + b) - MAX(0, S) + 1, 0 );  
 }  
   
 int main()  
 {  
     int i;  
   
     freopen("plus.in", "r", stdin);  
     freopen("plus.out", "w", stdout);  
   
     scanf("%d", &S);  
   
     for (i = 1; i <= 3; i++) {  
         scanf("%d %d", &nr[i], &s[i]);  
         if (!s[i]) nr0[i] = nr[i];  
     }  
   
     for (i = 1; i <= 3; i++)   
         if (s[i] == 1) break;  
   
     if (i == 4) {  
         if (S) printf("0\n");  
         else printf("%lld\n", (LL) (nr0[1] + 1) * (nr0[2] + 1) * (nr0[3] + 1));  
         return 0;  
     }  
   
     int q = nr[i];  
     s[i] = 0;  
   
     e = 0;  
   
     for (i = 1; i <= 3; i++)  
         if (s[i] != 0) {  
             if (!e) a = nr[i], sa = s[i], e = 1;  
             else b = nr[i], sb = s[i];  
         }  
   
     if (!sb) e = 0;  
     else {  
         if (sa < 0 && sb > 0) {  
             int aux;  
             aux = a; a = b; b = aux;  
             aux = sa; sa = sb; sb = aux;  
         }  
     }  
   
     LL rez = 0;  
     for (i = 0; i <= q; i++) {  
         rez += (LL) nr_aleg(S - i) * (nr0[1] + 1) * (nr0[2] + 1) * (nr0[3] + 1);  
     }  
   
     printf("%lld\n", rez);  
   
 return 0;  
}