Pagini recente » Cod sursa (job #2978142) | Cod sursa (job #1990578) | Cod sursa (job #1537217) | Cod sursa (job #1422650) | Cod sursa (job #482020)
Cod sursa(job #482020)
#include <stdio.h>
#define Nmax 22
#define Kmax 32
#define Smax 10002
#define Mod 3210121
int A[Nmax][Kmax],ex[Kmax][Smax],cp[Kmax][Smax],Max[Nmax][Kmax];
int N,K,S,rez,nr;
inline int Maxim(int x,int y){ return x>y ? x:y; }
void back(int k){
int j,sum;
if( k>N ){
for(j=1,sum=0;j<=K;++j)
sum+=Max[N][j];
sum=S-sum;
if( (nr & 1)==0 )
rez = (rez+cp[K][sum])%Mod;
else rez = rez-cp[K][sum]>=0 ? rez-cp[K][sum] : rez-cp[K][sum]+Mod;
}
else{
//0
for(j=1;j<=K;++j) Max[k][j]=Max[k-1][j];
back(k+1);
//1
nr++;
for(j=1;j<=K;++j) Max[k][j]=Maxim(Max[k-1][j],A[k][j]);
back(k+1);
nr--;
}
}
int main(){
int i,j;
freopen("cowfood.in","r",stdin);
freopen("cowfood.out","w",stdout);
scanf("%d%d%d",&K,&S,&N);
for(i=1;i<=N;++i)
for(j=1;j<=K;++j) scanf("%d",&A[i][j]);
cp[1][0]=1;
for(j=1;j<=S;++j) ex[1][j]=1, cp[1][j]=(cp[1][j-1]+1)%Mod;
for(i=2;i<=K;++i){
cp[i][0]=1;
for(j=1;j<=S;++j){
ex[i][j]=cp[i-1][j];
cp[i][j]=(cp[i][j-1]+ex[i][j])%Mod;
}
}
back(1);
rez = rez-(S*K+1) >= 0 ? rez-(S*K+1) : rez-(S*K+1)+Mod;
printf("%d\n",rez);
fclose(stdin); fclose(stdout);
return 0;
}