Pagini recente » Cod sursa (job #1172870) | Cod sursa (job #1815312) | Cod sursa (job #2893963) | Cod sursa (job #1661253) | Cod sursa (job #1524930)
#include <stdio.h>
#define MAXN 20
#define MAXK 30
#define MAXS 10000
#define MOD 3210121
int n, k, s;
int food[MAXN][MAXK];
int v[MAXK];
int comb[MAXS + MAXK][MAXK];
int rez = 0;
inline int max2(int a, int b){
return a > b ? a : b;
}
inline void precalc(){
int i, j;
comb[0][0] = 1;
for(i = 1; i < MAXS + MAXK; i++){
comb[i][0] = 1;
for(j = 1; j < MAXK; j++){
comb[i][j] = comb[i - 1][j] + comb[i - 1][j - 1];
if(comb[i][j] >= MOD)
comb[i][j] -= MOD;
}
}
for(j = 0; j < MAXK; j++){
for(i = j + 1; i < MAXS + MAXK; i++){
comb[i][j] += comb[i - 1][j];
if(comb[i][j] >= MOD)
comb[i][j] -= MOD;
}
}
}
inline int solve(int *v){
int cs = s, i, rez;
for(i = 0; i < k; i++)
cs -= v[i];
if(cs < 0)
return 0;
else{
rez = comb[k - 1 + cs][k - 1];
char g = 0;
for(i = 0; i < k; i++)
if(v[i] > 0)
g++;
if(g == 0)
rez -= k * cs + 1;
else if(g == 1)
rez -= cs + 1;
rez += MOD;
while(rez >= MOD)
rez -= MOD;
return rez;
}
}
void pinex(int p, int nr, int *v){
if(p == n){
if(nr & 1)
rez -= solve(v);
else
rez += solve(v);
rez += MOD;
while(rez >= MOD)
rez -= MOD;
}
else{
int v1[MAXK], i;
for(i = 0; i < k; i++)
v1[i] = v[i];
pinex(p + 1, nr, v1);
for(i = 0; i < k; i++)
v1[i] = max2(v1[i], food[p][i]);
pinex(p + 1, nr + 1, v1);
}
}
int main(){
precalc();
FILE *in = fopen("cowfood.in", "r");
int i, j;
fscanf(in, "%d%d%d", &k, &s, &n);
for(i = 0; i < n; i++){
for(j = 0; j < k; j++){
fscanf(in, "%d", &food[i][j]);
}
}
fclose(in);
for(i = 0; i < k; i++)
v[i] = 0;
pinex(0, 0, v);
FILE *out = fopen("cowfood.out", "w");
fprintf(out, "%d", rez);
fclose(out);
return 0;
}