Pagini recente » Winter Challenge, Clasament pentru clasele IX-X | Cod sursa (job #275825) | Cod sursa (job #1083196) | Cod sursa (job #1663005) | Cod sursa (job #660469)
Cod sursa(job #660469)
#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 ];
}
int nr;
void bkt(int p,int *vec)
{
if (p==N+1)
{
if (!nr) return;
if (nr&1)
Rez=(Rez+add(vec))%mod;
else Rez=(Rez-add(vec)+mod)%mod;
return;
}
bkt(p+1,vec);
int vn[K+3];
memset(vn,0,sizeof(vn));
for (int i=1;i<=K;++i)
vn[i]=max(vec[i],v[p][i]);
++nr;
bkt(p+1,vn);
--nr;
}
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;
int vec[KMax];
memset(vec,0,sizeof(vec));
bkt(1,vec);
freopen(OUT,"w",stdout);
printf("%d\n",(T[S]-Rez+mod)%mod);
fclose(stdout);
return 0;
}