Cod sursa(job #253257)

Utilizator 630r63Ilinca George Mihai 630r63 Data 5 februarie 2009 16:46:01
Problema Cowfood Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
 #include <stdio.h>  
 #define KMAX 32  
 #define NMAX 22  
 #define SMAX 10100  
 #define MAX(a,b) ((a)>(b)?(a):(b))  
 #define MIN(a,b) ((a)<(b)?(a):(b))  
 #define MOD 3210121  
 #define mod(a) (((a) >= MOD) ? ((a)-MOD):(a))  
   
 int A[SMAX][NMAX], S, N, K, Sol, IT, Sum[SMAX][NMAX];  
 int E[NMAX][KMAX], v[NMAX][KMAX];  
   
 void solve(int nv, int sgn, int num)  
 {  
         int i, j, sum;  
   
         for (i = nv; i <= N; i++)  
         {  
                 sum = 0;  
                 for (j = 1; j <= K; j++)  
                     v[num+1][j] = MAX(v[num][j], E[i][j]), sum += v[num+1][j];  
   
        
   
                 if (S-sum >= 0)  
                       Sol = (Sol + Sum[S-sum][K] * sgn + MOD) % MOD;  
                 IT++;  
                 solve(i+1, -1*sgn, num+1);  
         }  
 }  
   
 int main()  
 {  
         int i, j, k;  
   
         freopen("cowfood.in", "r", stdin);  
         scanf("%d %d %d", &K, &S, &N);  
   
         A[0][0] = Sum[0][0] = 1;  
   
     for (i = 1; i <= S; i++)  
         Sum[i][0] = 1;  
   
     for (j = 1; j <= K; j++)  
     {  
         A[0][j] = Sum[0][j] = 1;  
   
         for (i = 1; i <= S; i++)  
             A[i][j] = Sum[i][j - 1],  
             Sum[i][j] = (Sum[i - 1][j] + A[i][j]) % MOD;  
     }  
   
   
   

   
   
         for (i = 1; i <= N; i++)  
             for (j = 1; j <= K; j++) scanf("%d", E[i]+j);  
   
     Sol = 0;  
     for (i = 2; i <= S; i++)  
         Sol = (Sol + A[i][K] - K + MOD) % MOD;  
   
   
    
   
         solve(1,-1,0);  
   
         freopen("cowfood.out", "w", stdout);  
         printf("%d\n", Sol);  
   
         return 0;  
}