Pagini recente » Cod sursa (job #1220702) | Cod sursa (job #1902428) | Cod sursa (job #1432700) | Cod sursa (job #236320) | Cod sursa (job #660350)
Cod sursa(job #660350)
#include <stdio.h>
#include <string.h>
#define NMax 32
#define KMax 32
#define SMax 10010
const char IN[]="cowfood.in",OUT[]="cowfood.out";
const int mod = 3210121;
int N,S,K,Rez;
int v[NMax][KMax];
int aux[NMax];
int T[SMax];
inline int max(int x,int y){
return x>y ? x : y;
}
inline int add(int *st)
{
int s=0;
for (int i=1;i<=K;++i) s+=st[i];
if ( s>S ) return 0;
return T[ S - s ];
}
void bkt()
{
int i,j,k,nrbits;
for (i=1;i<(1<<N);++i)
{
memset(aux,0,sizeof(aux));nrbits=0;
for (j=0;j<N;++j) if ( i&(1<<j) )
for (k=1,nrbits^=1;k<=K;++k)
aux[k]=max(v[j+1][k],aux[k]);
if (nrbits)
Rez+=add(aux);
else
Rez+=-add(aux)+mod;
while (Rez>=mod) Rez-=mod;
}
}
int main()
{
int i,j;
freopen(IN,"r",stdin);
scanf("%d%d%d",&K,&S,&N);
for (i=1;i<=N;++i)
for (j=1;j<=K;++j)
scanf("%d",&v[i][j]);
fclose(stdin);
for ( i=0;i<=S;++i) T[i]=1;
for ( i=1;i<=K;++i)
for (j=1;j<=S;++j)
T[j]+=T[j-1],
(T[j]>=mod) ? T[j]-=mod : 0;
bkt();
freopen(OUT,"w",stdout);
printf("%d\n",(T[S]-Rez+mod)%mod);
fclose(stdout);
return 0;
}