Pagini recente » Cod sursa (job #2895775) | Cod sursa (job #1317669) | Cod sursa (job #2610649) | Cod sursa (job #1844068) | Cod sursa (job #1159995)
#include<stdio.h>
#include<math.h>
#include<algorithm>
const int MOD=3210121, S=10015, K=35, N=25;
using namespace std;
FILE *f,*g;
int comb[S*10+K*10];
int a[N*10][K*10]; int n,k,s;
int minim[N*10][K*10]; 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;comb[k]=1;
for(i=k+1;i<=S+K-1;i++){
comb[i]=((long long)comb[i-1]*i)%MOD;
comb[i]=((long long)comb[i]*invers(i-k))%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,bool ok){
if (i == k) {
int sum=0; int j;
for(j=1; j<=k ;j++) sum += minim[i][j];
if (ok) {if (sum <= s) {posib=modulo(posib - comb[s-sum+k]); } }
else if (sum <= s) {posib=modulo(posib + comb[s-sum+k]); }
}
else {
int j;
for(j=1;j<=k;j++) minim[i+1][j]=minim[i][j];
go(i+1,ok);
for(j=1; j<=k; j++) {minim[i+1][j] = max ( minim[i][j], a[i+1][j] ); }
go(i+1,1-ok);
}
}
int main(void){
read();
combinari();
/* go(0,0);
posib=modulo(posib-s*k-1);
fprintf(g,"%d",posib);
*/
return 0;
}