Pagini recente » Cod sursa (job #824798) | Cod sursa (job #1324584) | Cod sursa (job #1341709) | Cod sursa (job #2560754) | Cod sursa (job #999697)
Cod sursa(job #999697)
#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;
}