Pagini recente » Cod sursa (job #2808024) | Cod sursa (job #1806502) | Cod sursa (job #1712403) | Cod sursa (job #1762150) | Cod sursa (job #2334347)
#include <cstdio>
#include <iostream>
#define MOD 3210121
using namespace std;
int v[50][50],d[50][10010],w[50],biti[(1<<20)];
int n,k,s,impos;
void back (int pas,int nr){
if (pas==n){
/// build sol
if (!nr || w[0]>s)
return;
if (biti[nr]%2==1) /// add la impos /// suma in w[0]
impos=(impos+d[k][s-w[0]])%MOD;
else
impos=(impos-d[k][s-w[0]]+MOD)%MOD;
return;
}
/// setam bitul pas
/// caz 1: bitul pas ramane 0
back(pas+1,nr);
/// caz 2: bitul pas e 1
int i,aux[31];
aux[0]=w[0];
for (i=1;i<=k;i++){
aux[i]=w[i];
w[0]-=w[i];
w[i]=max(w[i],v[pas+1][i]);
w[0]+=w[i];
}
back(pas+1,nr+(1<<pas));
for (i=0;i<=k;i++)
w[i]=aux[i];
}
int main()
{
FILE *fin=fopen ("cowfood.in","r");
FILE *fout=fopen ("cowfood.out","w");
int i,j,total;
fscanf (fin,"%d%d%d",&k,&s,&n);
for (i=1;i<(1<<n);i++)
biti[i]=i%2+biti[i/2];
for (i=1;i<=n;i++){
for (j=1;j<=k;j++){
fscanf (fin,"%d",&v[i][j]);
v[i][0]=(v[i][0]+v[i][j])%MOD; /// suma tuturor
}
}
for (j=0;j<=s;j++)
d[1][j]=1;
for (i=2;i<=k;i++){
d[i][0]=1;
for (j=1;j<=s;j++){ /// d[i][j] = j bile in i cutii
d[i][j]=(d[i-1][j]+d[i][j-1])%MOD;
}
}
for (j=1;j<=s;j++)
d[k][j]=(d[k][j]+d[k][j-1])%MOD;
total=(d[k][s]-(k*s)%MOD-1 + MOD)%MOD; /// nr total de moduri
back(0,0);
fprintf (fout,"%d",(total-impos+MOD)%MOD);
return 0;
}