Cod sursa(job #320635)

Utilizator Magnuscont cu nume gresit sau fals Magnus Data 5 iunie 2009 12:13:29
Problema Cowfood Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include<stdio.h>   
#define MAX(a,b)((a)>(b)?(a):(b))   
#define MIN(a,b)((a)<(b)?(a):(b))   
#define M 3210121   
#define mod(a)(((a)>=M)?((a)-M):(a))   
int a[10100][25],S,n,K,s,Sum[10100][25],E[25][35],v[25][35];   
void solv(int x,int y,int z){   
    int i,j,sum;   
        for(i=x;i<=n;i++){   
            sum=0;   
            for(j=1;j<=K;j++){   
                v[z+1][j]=MAX(v[z][j],E[i][j]);   
                sum+=v[z+1][j];   
            }   
            if (S-sum >=0){   
                s=mod(s+Sum[S-sum][K]*y+M);   
                while(s>=M)   
                    s=mod(s);   
            }   
            solv(i+1,-1*y,z+1);   
        }   
}   
int main(){   
    int i,j;   
    freopen("cowfood.in","r",stdin);   
    freopen("cowfood.out","w",stdout);   
    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])%M;   
    }   
    for(i=1;i<=n;i++)   
            for(j=1;j<=K;j++)   
                scanf("%d",E[i]+j);   
    s=0;   
    for(i=2;i<=S;i++){   
        s=mod(s+a[i][K]-K+M);   
        while(s>=M)   
            s=mod(s);   
    }   
    solv(1,-1,0);   
    printf("%d\n",s);   
    fclose(stdin);   
    fclose(stdout);   
    return 0;   
}