Pagini recente » Cod sursa (job #1886353) | Cod sursa (job #1713752) | Cod sursa (job #343552) | Cod sursa (job #2178684) | Cod sursa (job #1734367)
#include <cstdio>
#define MAXS 10000
#define MAXK 20
#define MOD 3210121
using namespace std;
struct experiment{
int cant[MAXK];
} v[MAXK], aux[MAXK], exp;
int dp[MAXK+2][MAXS+1], n, k, s, sol;
inline int maxim(int a, int b){
if(a>b)
return a;
return b;
}
void bkt(int niv, int cate){
if(niv>=n){
int sum=0;
for(int i=0; i<k; i++)
sum+=exp.cant[i];
if(sum<=s && cate>0){
if(cate&1){
sol+=dp[k+1][s-sum];
if(sol>=MOD)
sol-=MOD;
} else{
sol-=dp[k+1][s-sum];
if(sol<0)
sol+=MOD;
}
}
return;
}
bkt(niv+1, cate);
for(int i=0; i<k; i++){
aux[niv].cant[i]=exp.cant[i];
exp.cant[i]=maxim(exp.cant[i], v[niv].cant[i]);
}
bkt(niv+1, cate+1);
for(int i=0; i<k; i++)
exp.cant[i]=aux[niv].cant[i];
}
int main()
{
FILE *fin, *fout;
int i, j;
fin=fopen("cowfood.in", "r");
fscanf(fin, "%d%d%d", &k, &s, &n);
for(i=0; i<n; i++)
for(j=0; j<k; j++)
fscanf(fin, "%d", &v[i].cant[j]);
fclose(fin);
for(j=0; j<=k+1; j++)
dp[j][0]=1;
for(i=1; i<=k+1; i++){
for(j=0; j<=s+1; j++){
if (i==0 || i==1)
dp[i][j]=1;
else
dp[i][j]=(dp[i-1][j]+dp[i][j-1])%MOD;
}
}
bkt(0, 0);
fout=fopen("cowfood.out", "w");
fprintf(fout, "%d\n", (dp[k+1][s]-sol-s*k-1+3*MOD)%MOD);
fclose(fout);
return 0;
}