Cod sursa(job #999697)

Utilizator geniucosOncescu Costin geniucos Data 21 septembrie 2013 11:48:24
Problema Cowfood Scor 18
Compilator cpp Status done
Runda Lista lui wefgef Marime 1.84 kb
#include<cstdio>
using namespace std;
int n,m,sol,sum,S,i,mod,j,dp[2][10009],cate[10009],s[2][10009],ma[34],a[23][34];
void back(int poz,int k)
{
    int cop[31];
    if(poz==n+1)
    {
        if(k==0) return ;
        sum=0;
        for(i=1;i<=m;i++)
            sum+=ma[i];
        if(sum<=S)
        {
            if(k&1)
            {
                sol+=cate[S-sum];
                if(sol>=mod) sol-=mod;
            }
            else
            {
                sol-=cate[S-sum];
                if(sol<0) sol+=mod;
            }
        }
        return ;
    }
    back(poz+1,k);
    for(i=1;i<=m;i++)
        cop[i]=ma[i];
    for(i=1;i<=m;i++)
        if(a[poz][i]>ma[i]) ma[i]=a[poz][i];
    back(poz+1,k+1);
    for(i=1;i<=m;i++)
        ma[i]=cop[i];
}
int main()
{
freopen("cowfood.in","r",stdin);
freopen("cowfood.out","w",stdout);
scanf("%d",&m);
scanf("%d",&S);
scanf("%d",&n);
for(i=1;i<=n;i++)
    for(j=1;j<=m;j++)
        scanf("%d",&a[i][j]);
mod=3210121;
////dp[i][j] in cate moduri il pot scrie pe j ca saum de i factori
for(i=0;i<=S;i++)
    dp[1][i]=1;
for(i=0;i<=S;i++)
    s[1][i]=i+1;
for(i=2;i<=m;i++)
    for(j=0;j<=S;j++)
    {
        dp[i&1][j]=s[(i&1)^1][j];
        if(j>0) s[i&1][j]=s[i&1][j-1];
        else s[i&1][j]=0;
        s[i&1][j]+=dp[i&1][j];
        if(s[i&1][j]>=mod) s[i&1][j]-=mod;
    }
for(i=0;i<=S;i++)
    cate[i]=s[m&1][i];
back(1,0);
for(i=1;i<=S;i++)
    dp[1][i]=1;
for(i=1;i<=S;i++)
    s[1][i]=i;
s[1][0]=0;
for(i=2;i<=m;i++)
{
    s[i&1][0]=0;
    for(j=1;j<=S;j++)
    {
        dp[i&1][j]=s[(i&1)^1][j-1];
        s[i&1][j]=s[i&1][j-1];
        s[i&1][j]+=dp[i&1][j];
        if(s[i&1][j]>=mod) s[i&1][j]-=mod;
    }
}
for(i=1;i<=S;i++)
    cate[i]=s[m&1][i];
sol=cate[S]-sol+mod;
sol%=mod;
printf("%d\n",sol);
return 0;
}