Pagini recente » Cod sursa (job #2524396) | Cod sursa (job #2934437) | Cod sursa (job #1173907) | Cod sursa (job #244457) | Cod sursa (job #1162894)
//Problem cowfood from Infoarena
#include <cmath>
#include <algorithm>
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
ifstream fin("cowfood.in");
ofstream fout("cowfood.out");
const int INF = 1 << 30;
const int MOD = 3210121;
const int MAX_N = 21;
const int MAX_K = 31;
const int MAX_S = 10100;
int K, S, N;
int fact[MAX_S];
int inv_fact[MAX_S];
int a[MAX_N][MAX_S];
int f[MAX_S];
int mx[MAX_K];
int log_pow(int n, int p);
int mod(long long n);
int comb(int n, int k);
int main() {
fin >> K >> S >> N;
for (int i = 0; i < N; i += 1)
for (int j = 0; j < K; j += 1)
fin >> a[i][j];
fact[0] = inv_fact[0] = 1;
for (int i = 1; i <= S + K; i += 1) {
fact[i] = mod(1LL * fact[i - 1] * i);
inv_fact[i] = log_pow(fact[i], MOD - 2);
}
for (int i = 0; i <= S; i += 1) {
f[i] = comb(i + K - 1, K - 1);
if (i > 0)
f[i] = mod(f[i] + f[i - 1]);
}
int ans = 0;
for (int mask = 0; mask < (1 << N); mask += 1) {
int sum = 0, sign = 1;
for (int i = 0; i < N; i += 1) {
if ((1 << i) & mask) {
sign *= -1;
for (int j = 0; j < K; j += 1) {
mx[j] = max(mx[j], a[i][j]);
}
}
}
for (int i = 0; i < K; i += 1) sum += mx[i];
if (sum <= S) ans = mod(ans + f[S - sum] * sign);
for (int i = 0; i < K; i += 1) mx[i] = 0;
}
ans = mod(ans - (K * S + 1));
fout << ans;
return 0;
}
inline int log_pow(int n, int p) {
int res = 1;
for (; p; p >>= 1) {
if (p & 1)
res = mod(1LL * res * n);
n = mod(1LL * n * n);
}
return res;
}
inline int comb(int n, int k) {
return mod(1LL * fact[n] * inv_fact[k] * inv_fact[n - k]);
}
inline int mod(long long n) {
while (n < 0) n += MOD;
if (n < MOD) return n;
if (n < 2 * MOD) return n - MOD;
return n % MOD;
}