Pagini recente » Cod sursa (job #1235350) | Cod sursa (job #2082802) | Cod sursa (job #1760870) | Cod sursa (job #1943450) | Cod sursa (job #3123937)
#include <fstream>
using namespace std;
ifstream f("cowfood.in");
ofstream g("cowfood.out");
#define MAXK 30LL
#define MAXS 10000LL
#define MAXN 20LL
#define MOD 3210121LL
#define popcnt(x) __builtin_popcount(x)
long long k, s, n, i, j, a[22][32], a2[32], comb[10100][31], mask, aux, x, ans, suma, nr;
long long prea1[1031][32], prea2[1031][32];
int main()
{
for (i = 0; i <= MAXK; i++) {
comb[i][i] = 1;
}
for (i = 0; i <= MAXK+MAXS+1; i++) {
comb[i][0] = 1;
}
for (i = 1; i <= MAXK+MAXS+1; i++) {
for (j = 1; j <= min(i-1, MAXK); j++) {
comb[i][j] = (comb[i-1][j] + comb[i-1][j-1]) % MOD;
}
}
f >> k >> s >> n;
for (i = 1; i <= n; i++) {
for (j = 1; j <= k; j++) {
f >> a[i][j];
}
}
for (mask = 0; mask < (1LL << (MAXN/2)); mask++) {
for (i = 0; i < MAXN/2; i++) {
if (mask & (1 << i)) {
for (j = 1; j <= k; j++) {
prea1[mask][j] = max(prea1[mask][j], a[i+1][j]);
}
}
}
}
for (mask = 0; mask < (1LL << (MAXN/2)); mask++) {
for (i = 0; i < MAXN/2; i++) {
if (mask & (1 << i)) {
for (j = 1; j <= k; j++) {
prea2[mask][j] = max(prea2[mask][j], a[i+1+(MAXN/2)][j]);
}
}
}
}
for (mask = 1; mask < (1LL << n); mask++) {
for (i = 1; i <= k; i++) {
a2[i] = 0;
}
if (popcnt(mask) % 2 == 1)
x = 1;
else
x = -1;
aux = (mask & ((1LL << (MAXN/2)) - 1));
for (j = 1; j <= k; j++) {
a2[j] = max(a2[j], prea1[aux][j]);
}
aux = ((mask >> (MAXN/2)) & ((1LL << (MAXN/2)) - 1));
for (j = 1; j <= k; j++) {
a2[j] = max(a2[j], prea2[aux][j]);
}
nr = 0;
suma = 0;
for (i = 1; i <= k; i++) {
suma += a2[i];
nr += (a2[i] > 0);
}
if (suma > s) {
continue;
}
suma = s-suma;
if (nr >= 2) {
aux = comb[suma+k][k];
}
else if (nr == 1) {
aux = comb[suma+k][k] - (suma+1);
}
else {
aux = comb[suma+k][k] - k * suma - 1;
}
ans = ans + x * aux;
}
ans %= MOD;
suma = s;
aux = (comb[suma+k][k] - k * suma - 1) % MOD;
ans = aux - ans;
ans %= MOD;
if (ans < 0)
ans += MOD;
g << ans;
f.close();
g.close();
return 0;
}