Cod sursa(job #42970)

Utilizator fireatmyselfBogdan-Alexandru Stoica fireatmyself Data 29 martie 2007 18:03:27
Problema Cowfood Scor 2
Compilator c Status done
Runda Arhiva de probleme Marime 1.64 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;

        if (num == N)
           return;

        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 = mod(Sol+A[S-sum][K]*sgn);
                      while (Sol >= MOD) Sol = mod(Sol);
                   }
                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] += Sum[i-1][0];
            for (j = 1; j <= K; j++)
            {
                A[i][j] = A[i][j-1];
                A[i][j] = mod(A[i][j]+Sum[i-1][j-1]), Sum[i][j] = mod(Sum[i-1][j]+A[i][j]);
            }
        }

        for (i = 1; i <= N; i++)
            for (j = 1; j <= K; j++) scanf("%d", E[i]+j);

        for (i = 1; i <= S; i++)
            for (j = 1; j <= K; j++) A[i][j]--;

        Sol = A[S][K];
        solve(1,-1,0);

        freopen("cowfood.out", "w", stdout);
        printf("%d\n", Sol);

        return 0;
        
}