Pagini recente » Cod sursa (job #621058) | Cod sursa (job #1866664) | Cod sursa (job #1707247) | Cod sursa (job #354624) | Cod sursa (job #810927)
Cod sursa(job #810927)
#include<stdio.h>
#define maxn 23
#define maxk 31
#define maxS 10005
#define mod 3210121
FILE*f=fopen("cowfood.in","r");
FILE*g=fopen("cowfood.out","w");
int n,k,S,sol,puse;
int a[maxn][maxk],D[maxk][maxS],x[maxn],minim[maxn][maxk];
inline void dinamica () {
for ( int j = 0 ; j <= S ; ++j ){
D[0][j] = 1;
}
for ( int i = 1 ; i <= k ; ++i ){
for ( int j = 0 ; j <= S ; ++j ){
D[i][j] = D[i-1][j];
if ( j > 0 ){
D[i][j] += D[i][j-1];
if ( D[i][j] >= mod ) D[i][j] -= mod;
}
}
}
}
void back ( int niv ){
if ( niv == n+1 ){
if ( !puse ) return ;
int sum = 0;
for ( int j = 1 ; j <= k ; ++j ){
sum += minim[puse][j];
}
int remaining = S-sum,r = 0;
if ( remaining >= 0 ){
r = D[k][remaining];
}
if ( puse & 1 ){
sol += r;
if ( sol >= mod ) sol -= mod;
}
else{
sol -= r;
if ( sol < 0 ) sol += mod;
}
return ;
}
back(niv+1);
x[++puse] = niv;
for ( int i = 1 ; i <= k ; ++i ) minim[puse][i] = minim[puse-1][i] > a[niv][i] ? minim[puse-1][i] : a[niv][i];
back(niv+1);
x[puse--] = 0;
}
int main () {
fscanf(f,"%d %d %d",&k,&S,&n);
for ( int i = 1 ; i <= n ; ++i ){
for ( int j = 1 ; j <= k ; ++j ){
fscanf(f,"%d",&a[i][j]);
}
}
dinamica();
back(1);
sol = D[k][S] - sol; if ( sol < 0 ) sol += mod;
sol = sol - S*k - 1; if ( sol < 0 ) sol += mod;
fprintf(g,"%d\n",sol);
fclose(f);
fclose(g);
return 0;
}