Pagini recente » Cod sursa (job #780081) | Cod sursa (job #2615395) | Cod sursa (job #532707) | Cod sursa (job #1089971) | Cod sursa (job #2097852)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("cowfood.in");
ofstream out("cowfood.out");
const int NMAX = 30;
const int KMAX = 40;
const int SMAX = 10000 + 100;
const int MOD = 3210121;
int n, k, s, res, sgn = 1;
int a[1 + NMAX][1 + NMAX];
int dp[1 + KMAX][1 + SMAX];
int p[1 + SMAX];
int ans[1 + NMAX][1 + KMAX];
void bkt(int x) {
if(x == n + 1) {
int ss = 0;
for(int i = 1; i <= k; i++) {
ss += ans[x][i];
}
if(ss <= s)
res = (res + sgn * p[s - ss] + MOD) % MOD;
} else {
for(int i = 1; i <= k; i++)
ans[x + 1][i] = ans[x][i];
bkt(x + 1);
sgn *= -1;
for(int i = 1; i <= k; i++)
ans[x + 1][i] = max(ans[x][i], a[x][i]);
bkt(x + 1);
sgn *= -1;
}
}
int main()
{
in >> k >> s >> n;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= k; j++) {
in >> a[i][j];
}
}
for(int i = 0; i <= k; i++)
dp[i][0] = 1;
for(int i = 0; i <= s; i++)
dp[0][i] = 1;
for(int i = 1; i <= k; i++) {
for(int j = 1; j <= s; j++) {
dp[i][j] = (dp[i][j - 1] + dp[i - 1][j]) % MOD;
}
}
for(int i = 0; i <= s; i++)
p[i] = dp[k][i];
bkt(1);
out << (res - (s * k + 1) + MOD) % MOD << '\n';
in.close();
out.close();
return 0;
}