Pagini recente » Cod sursa (job #2778027) | Cod sursa (job #401538) | Cod sursa (job #2181136) | Cod sursa (job #288137) | Cod sursa (job #1159903)
#include<stdio.h>
#include<math.h>
#include<algorithm>
const int MOD=3210121, S=10001, K=31, N=21;
using namespace std;
FILE *f,*g;
int comb[S][K];
int a[N][K]; int n,k,s;
int minim[N][K]; int posib;
void read(void){
f=fopen("cowfood.in","r");
g=fopen("cowfood.out","w");
fscanf(f,"%d%d%d",&k,&s,&n);
int i,j;
for(i=1; i<=n; i++){
for (j=1; j<=k; j++){
fscanf(f,"%d",&a[i][j]);
}
}
for(j=1; j<=k; j++) {a[0][j]=0; minim[0][j]=0;}
}
int expo(int n, int t){
int x;
if (t==0) return 1;
else {x=expo(n,t/2); if (t%2 == 0) return ((long long)x*x)%MOD; else { x= ((long long)x*x)%MOD; return ((long long)x*n)%MOD;} }
}
int invers(int n){
return expo(n,MOD-2);
}
void combinari(void){
int i,j;
for(i=1;i<=S-1;i++){
comb[i][0]=1;
for(j=1; j<=i && j<=K-1 ; j++){
comb[i][j]=((long long)comb[i][j-1]*(i-j+1))%MOD;
comb[i][j]=((long long)comb[i][j]*invers(j))%MOD;
}
}
}
int modulo(int x){
if (x<0) return x+MOD;
else if (x>=MOD) return x-MOD;
else return x;
}
void go(int i,int sum,bool ok){
if (i == k) {
if (ok) {if (sum <= s) {posib=modulo(posib - comb[s-sum+k][k]); } }
else if (sum <= s) {posib=modulo(posib + comb[s-sum+k][k]); }
}
else {
int j;
for(j=1;j<=k;j++) minim[i+1][j]=minim[i][j];
go(i+1,sum,ok);
sum=0; for(j=1; j<=k; j++) {minim[i+1][j] = max ( minim[i][j], a[i+1][j] ); sum += minim[i+1][j] ;}
go(i+1,sum,1-ok);
}
}
int main(void){
combinari();
read();
go(0,0,0);
posib=modulo(posib-s*k-1);
fprintf(g,"%d",posib);
return 0;
}