Pagini recente » Cod sursa (job #282835) | Cod sursa (job #3170997) | Cod sursa (job #2056096) | Cod sursa (job #1562159) | Cod sursa (job #660348)
Cod sursa(job #660348)
#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=(Rez+add(aux))%mod;
else
Rez=(Rez-add(aux)+mod)%mod;
}
}
int pow(int x,int p,int mod){
int sol=1,i;
for (i=0;(1<<i)<=p;++i)
{
if ( (1<<i)&p )
sol= sol*x%mod;
x= x*x%mod;
}
return sol;
}
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]+T[j-1])%mod;
bkt();
freopen(OUT,"w",stdout);
printf("%d\n",(T[S]-Rez+mod)%mod);
fclose(stdout);
return 0;
}