Pagini recente » Cod sursa (job #1985883) | Cod sursa (job #2001527) | Cod sursa (job #702790) | Cod sursa (job #59628) | Cod sursa (job #1548110)
#include <cstdio>
#define MOD 3210121
#define MAXK 30
#define MAXN 20
#define MAXS 10000
int w, k, st[MAXN+1][MAXK], a[MAXN][MAXK], u[MAXN+1], c[MAXN+1], v[MAXK], sum[MAXS+1], d[MAXK+1][MAXS+1];
inline void precalc(int n, int s){
int i, j;
for(i=1; i<=n; i++){
d[i][0]=1;
for(j=1; j<=s; j++){
d[i][j]=d[i-1][j]+d[i][j-1];
if(d[i][j]>=MOD){
d[i][j]-=MOD;
}
}
}
sum[0]=1;
for(j=1; j<=s; j++){
sum[j]=d[n][j]+sum[j-1];
if(sum[j]>=MOD){
sum[j]-=MOD;
}
}
}
inline int max2(int a, int b){
if(a>b){
return a;
}
return b;
}
inline int bagadans(int v[]){
int r, o=0, ans;
r=w;
for(int i=0; i<k; i++){
r-=v[i];
if(v[i]>0){
o++;
}
}
if(r<0){
return 0;
}
if(o>1){
ans=sum[r];
}else if(o==1){
ans=sum[r]-(r+1);
if(ans<0){
ans+=MOD;
}
}else{
ans=sum[r]-(k*r+1)%MOD;
if(ans<0){
ans+=MOD;
}
}
return ans;
}
int main(){
int ans, n, i, j, vf;
FILE *fin, *fout;
fin=fopen("cowfood.in", "r");
fout=fopen("cowfood.out", "w");
fscanf(fin, "%d%d%d", &k, &w, &n);
precalc(k, w);
for(i=0; i<n; i++){
for(j=0; j<k; j++){
fscanf(fin, "%d", &a[i][j]);
}
}
vf=1;
c[1]=0;
u[1]=0;
for(i=0; i<k; i++){
st[1][i]=0;
}
ans=0;
if(n>0){
while(vf>0){
if(c[vf]==n-1){
if(u[vf]%2==0){
ans+=bagadans(st[vf]);
if(ans>=MOD){
ans-=MOD;
}
}else{
ans-=bagadans(st[vf]);
if(ans<0){
ans+=MOD;
}
}
for(i=0; i<k; i++){
v[i]=max2(a[n-1][i], st[vf][i]);
}
if(u[vf]%2==1){
ans+=bagadans(v);
if(ans>=MOD){
ans-=MOD;
}
}else{
ans-=bagadans(v);
if(ans<0){
ans+=MOD;
}
}
vf--;
}else{
c[vf]++;
vf++;
u[vf]=u[vf-1]+1;
c[vf]=c[vf-1];
for(i=0; i<k; i++){
st[vf][i]=max2(a[c[vf]-1][i], st[vf-1][i]);
}
}
}
}else{
ans=bagadans(st[1]);
}
fprintf(fout, "%d\n", ans);
fclose(fin);
fclose(fout);
return 0;
}