Cod sursa(job #1494046)

Utilizator Alexa2001Alexa Tudose Alexa2001 Data 30 septembrie 2015 16:31:30
Problema Cowfood Scor 46
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <cstdio>
#define MOD 3210121

using namespace std;

int Max[22],nr,j,ans,a[32][32],n,i,m,s,Pos[10005][32];

inline void back(int nivel,int Max[22],int nr)
{
    int i,Max1[22];for(i=0;i<=20;++i) Max1[i]=Max[i];

    if(nivel<=n)
    {
        back(nivel+1, Max1, nr);

        for(i=1;i<=m;++i)
        if(a[nivel][i]>Max1[i])
        {
            Max1[0]-=Max1[i];
            Max1[i]=a[nivel][i];
            Max1[0]+=Max1[i];
        }
        if(Max1[0]<=s) back(nivel+1, Max1, nr+1);
        return;
    }
    if(nr&1) ans=(ans-Pos[s-Max[0]][m]+MOD)%MOD;
    else ans=(ans+Pos[s-Max[0]][m])%MOD;
}
int main()
{
    freopen("cowfood.in","r",stdin);
    freopen("cowfood.out","w",stdout);

    scanf("%d%d%d",&m,&s,&n);

    for(i=1;i<=n;++i)
    for(j=1;j<=m;++j)
    scanf("%d",&a[i][j]);

    for(i=1;i<=m;++i) Pos[0][i]=1;
   // for(i=1;i<=s;++i) Pos[i][0]=1;

    for(i=1;i<=s;++i)
    for(j=1;j<=m;++j)
    Pos[i][j]=(Pos[i][j-1]+Pos[i-1][j])%MOD;

    for(i=1;i<=s;++i)
    for(j=1;j<=m;++j)
    Pos[i][j]=(Pos[i-1][j]+Pos[i][j])%MOD;

    ans=0;
    back(1,Max,0);

    printf("%d\n",(ans-1-s*m+MOD)%MOD);

    return 0;
}