Pagini recente » Cod sursa (job #2275344) | Cod sursa (job #764885) | Cod sursa (job #1151019) | Cod sursa (job #2140070) | Cod sursa (job #1304719)
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("cowfood.in");
ofstream fout("cowfood.out");
const int MAX_N = 22;
const int MAX_K = 32;
const int MAX_S = 10100;
const int MOD = 3210121;
int d[MAX_S];
int v[MAX_N][MAX_K];
int put(int a, int b) {
if(b == 0) {
return 1;
}
if(b & 1) {
return ((long long)a * put(a, b - 1)) % MOD;
}
long long x = put(a, b / 2);
return (x * x) % MOD;
}
int main() {
int k, s, n;
fin >> k >> s >> n;
d[0] = 1;
for(int i = 1; i <= s; i++) {
d[i] = ((long long)((d[i - 1] * (i + k - 1)) % MOD) * put(i, MOD - 2)) % MOD;
}
for(int i = 1; i <= s; i++) {
d[i] = (d[i] + d[i - 1]) % MOD;
}
for(int i = 0; i < n; i++) {
for(int j = 1; j <= k; j++) {
fin >> v[i][j];
}
}
int ans = (d[s] - k * s - 1) % MOD;
if(ans < 0) {
ans += MOD;
}
for(int i = 1; i < (1 << n); i++) {
int sum = 0;
bool par = false;
for(int b = 0; b < n; b++) {
if(i & (1 << b)) {
par = par ^ true;
}
}
for(int j = 1; j <= k; j++) {
int val = 0;
for(int b = 0; b < n; b++) {
if(i & (1 << b)) {
val = max(val, v[b][j]);
}
}
sum += val;
}
if(sum <= s) {
if(par) {
ans = (ans - d[s - sum]) % MOD;
if(ans < 0) {
ans += MOD;
}
}
else {
ans = (ans + d[s - sum]) % MOD;
}
}
}
fout << ans;
return 0;
}