Pagini recente » Cod sursa (job #662462) | Cod sursa (job #2369260) | Cod sursa (job #413694) | Cod sursa (job #2651542) | Cod sursa (job #847023)
Cod sursa(job #847023)
#include <cstdio>
#define MOD 3210121
int n, k, s, i, j, t, nr1, semn, tot, sum;
int d[10010][32];
int M[32], v[32][32];
inline int maxim(int a, int b) {
return (a > b ? a : b);
}
int main() {
FILE *f = fopen("cowfood.in","r");
FILE *g = fopen("cowfood.out","w");
fscanf(f,"%d %d %d",&k,&s,&n);
for (i=0;i<n;i++)
for (j=1;j<=k;j++)
fscanf(f,"%d",&v[i][j]);
//D[i][j] = in cate moduri pot pune exact i bile identice in exact j cutii
//in cutia j pot pune 0 bile si atunci conteaza D[i][j-1] sau cel putin o bila
// caz in care bila i o pun in cutia j si atunci conteaza D[i-1][j]
for (i=0;i<=s+1;i++)
for (j=1;j<=k+1;j++)
if (i*j == 0)
d[i][j] = 1;
else
d[i][j] = (d[i-1][j] + d[i][j-1]) % MOD;
//pentru a afla in cate moduri pot pune cel mult i bile in exact j cutii conteaza
//d[i][j+1], adica pot pune in cutia j+1 0, 1, 2 ... i bile
for (i=1;i<=((1<<n)-1);i++) {
for (t=1;t<=k;t++) {
M[t] = 0;
}
sum = 0;
nr1 = 0;
for (j=0;j<n;j++)
if ((i>>j)&1) {
// folosesc mixtura j
nr1++;
for (t=1;t<=k;t++)
M[t] = maxim(M[t], v[j][t]);
}
for (t=1;t<=k;t++)
sum += M[t];
if (sum > s)
continue;
if (nr1 % 2 == 1) {
semn = 1;
} else {
semn = -1;
}
tot += (d[s-sum][nr1+1] * semn + 1) % MOD;
}
tot = d[s-k][k+1] - tot;
if (tot < 0)
tot += MOD;
fprintf(g,"%d\n",tot);
return 0;
}