Cod sursa(job #1548066)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 10 decembrie 2015 13:38:02
Problema Cowfood Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.61 kb
#include <cstdio>
#define MOD 3210121
#define MAXK 30
#define MAXN 20
#define MAXS 10000
int w, k, st[MAXN+1][MAXK], a[MAXN][MAXK], u[MAXN+1], c[MAXN+1], v[MAXK], sum[MAXS+1], d[MAXK+1][MAXS+1];
inline void precalc(int n, int s){
    int i, j;
    for(i=1; i<=n; i++){
        d[i][0]=1;
        for(j=1; j<=s; j++){
            d[i][j]=d[i-1][j]+d[i][j-1];
            if(d[i][j]>=MOD){
                d[i][j]-=MOD;
            }
        }
    }
    sum[0]=1;
    for(j=1; j<=s; j++){
        sum[j]=d[n][j]+sum[j-1];
        if(sum[j]>=MOD){
            sum[j]-=MOD;
        }
    }
}
inline int max2(int a, int b){
    if(a>b){
        return a;
    }
    return b;
}
inline int bagadans(int v[]){
    int r, o=0, ans;
    r=w;
    for(int i=0; i<k; i++){
        r-=v[i];
        if(v[i]>0){
            o++;
        }
    }
    if(r<0){
        return 0;
    }
    if(o>1){
        ans=sum[r];
    }else if(o==1){
        ans=sum[r]-(r+1);
        if(ans<0){
            ans+=MOD;
        }
    }else{
        ans=sum[r]-(k*r+1)%MOD;
        if(ans<0){
            ans+=MOD;
        }
    }
    return ans;
}
int main(){
    int ans, n, i, j, vf;
    FILE *fin, *fout;
    fin=fopen("cowfood.in", "r");
    fout=fopen("cowfood.out", "w");
    fscanf(fin, "%d%d%d", &k, &w, &n);
    //precalc(k, w);
    for(i=0; i<n; i++){
        for(j=0; j<k; j++){
            fscanf(fin, "%d", &a[i][j]);
        }
    }
    vf=1;
    c[1]=0;
    u[1]=0;
    for(i=0; i<k; i++){
        st[1][i]=0;
    }
    ans=0;
    while(vf>0){
        if(c[vf]==n-1){
            if(u[vf]%2==0){
                ans+=bagadans(st[vf]);
                if(ans>=MOD){
                    ans-=MOD;
                }
            }else{
                ans-=bagadans(st[vf]);
                if(ans<0){
                    ans+=MOD;
                }
            }
            for(i=0; i<k; i++){
                v[i]=max2(a[n-1][i], st[vf][i]);
            }
            if(u[vf]%2==1){
                ans+=bagadans(v);
                if(ans>=MOD){
                    ans-=MOD;
                }
            }else{
                ans-=bagadans(v);
                if(ans<0){
                    ans+=MOD;
                }
            }
            vf--;
        }else{
            c[vf]++;
            vf++;
            u[vf]=u[vf-1]+1;
            c[vf]=c[vf-1];
            for(i=0; i<k; i++){
                st[vf][i]=max2(a[c[vf]-1][i], st[vf][i]);
            }
        }
    }
    fprintf(fout, "%d\n", ans);
    fclose(fin);
    fclose(fout);
    return 0;
}