Pagini recente » Monitorul de evaluare | Monitorul de evaluare | Monitorul de evaluare | Cod sursa (job #2710040) | Cod sursa (job #1524871)
#include <stdio.h>
#define MAXN 20
#define MAXK 30
#define MAXS 10000
#define MOD 3210121
int n, k, s;
short food[MAXN][MAXK];
short 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];
}
inline int solve(short *v){
int cs = s, i;
for(i = 0; i < k; i++)
cs -= v[i];
if(cs < 0)
return 0;
else
return comb[k - 1 + cs][k - 1];
}
void pinex(int b, int p, int nr, short *v){
if(p == n){
if(nr & 1)
rez -= solve(v);
else
rez += solve(v);
rez += MOD;
while(rez >= MOD)
rez -= MOD;
}
else{
short v1[MAXK], i;
for(i = 0; i < k; i++)
v1[i] = v[i];
pinex(2 * b, p + 1, nr, v1);
for(i = 0; i < k; i++)
v1[i] = max2(v1[i], food[p][i]);
pinex(2 * b + 1, 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] = 1;
pinex(0, 0, 0, v);
FILE *out = fopen("cowfood.out", "w");
fprintf(out, "%d", rez);
fclose(out);
return 0;
}