Cod sursa(job #174629)

Utilizator sealTudose Vlad seal Data 9 aprilie 2008 01:02:38
Problema Cowfood Scor 76
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include<stdio.h>
#include<string.h>
#define Km 31
#define Nm 20
#define Sm 10001
#define Mod 3210121
#define max(a,b) ((a)>(b)?(a):(b))
int A[Nm][Km],M[Km][Sm],V[Km],k,s,n,nr,ans;

void read()
{
    int i,j;
    
    freopen("cowfood.in","r",stdin);
    scanf("%d%d%d",&k,&s,&n);
    for(i=0;i<n;++i)
        for(j=0;j<k;++j)
            scanf("%d",&A[i][j]);
}

void back(int i)
{
    int V0[Km],j,v=s;

    if(i==n)
    {
        for(j=0;j<k;++j) v-=V[j];
        if(nr&1)
        {
            ans-=M[k][v];
            if(ans<0) ans+=Mod;
        }
        else
        {
            ans+=M[k][v];
            if(ans>=Mod) ans-=Mod;
        }
        return;
    }
    
    back(i+1);
    ++nr; memcpy(V0,V,sizeof(V));
    for(j=0;j<k;++j)
        V[j]=max(V[j],A[i][j]);
    back(i+1);
    --nr; memcpy(V,V0,sizeof(V));
}

void solve()
{
    int i,j;

    for(j=0;j<=s;++j)
        M[1][j]=j+1;
    for(i=2;i<=k;++i)
    {
        M[i][0]=1;
        for(j=1;j<=s;++j)
            M[i][j]=(M[i][j-1]+M[i-1][j])%Mod;
    }
    back(0);
    ans-=k*s+1;
    if(ans<0) ans+=Mod;
}

void write()
{
    freopen("cowfood.out","w",stdout);
    printf("%d\n",ans);
}

int main()
{
    read();
    solve();
    write();
    return 0;
}