Pagini recente » Cod sursa (job #2159180) | Cod sursa (job #65135) | Cod sursa (job #3000401) | Cod sursa (job #2577377) | Cod sursa (job #1497230)
#include <cstdio>
#include <algorithm>
#define MOD 3210121
using namespace std;
int n,s,m,v[25][35],D[35][10010],a[35],sol,i,j,ord[35];
void slv(int nr,int sum)
{
if (!nr) return;
if(nr&1)
sol=sol+D[n][s-sum];
else sol=sol-D[n][s-sum]+MOD;
if(sol>=MOD)
sol-=MOD;
}
void backk(int k,int a[35],int nr,int sum)
{
int crt[35],i;
if(k==m+1)
{
slv(nr,sum);
return;
}
for(i=1; i<=n; ++i)
crt[i]=a[i];
backk(k+1,crt,nr,sum);
for(i=1; i<=n; ++i)
if(crt[i]<v[ord[k]][i])
{
sum=sum-crt[i]+v[ord[k]][i];
crt[i]=v[ord[k]][i];
}
if(sum<=s)
backk(k+1,crt,nr+1,sum);
}
bool cmp(int a,int b)
{
if(v[0][a]>v[0][b])
return true;
return false;
}
int main()
{
freopen("cowfood.in","r",stdin);
freopen("cowfood.out","w",stdout);
scanf("%d%d%d",&n,&s,&m);
for(i=1; i<=m; ++i)
{
for(j=1; j<=n; ++j)
{
scanf("%d",&v[i][j]);
v[i][0]+=v[i][j];
}
ord[i]=i;
}
for(i=0; i<=n; ++i)
D[i][0]=1;
for(j=1; j<=s; ++j)
D[0][j]=1;
for(i=1; i<=n; ++i)
for(j=1; j<=s; ++j)
{
D[i][j]=D[i-1][j]+D[i][j-1]+MOD;
if(D[i][j]>=MOD)
D[i][j]-=MOD;
}
sort(ord+1,ord+n+1,cmp);
backk(1,a,0,0);
sol = (D[n][s] - sol + MOD) % MOD;
sol=(1LL*sol-1LL*n*s-1LL)%MOD;
printf("%d\n",sol);
return 0;
}