Pagini recente » Cod sursa (job #953195) | Cod sursa (job #1968787) | Cod sursa (job #185304) | Cod sursa (job #2668804) | Cod sursa (job #344666)
Cod sursa(job #344666)
#include <cstdio>
#define maxk 32
#define maxn 21
#define maxs 10100
#define mod 3210121
using namespace std;
int k, s, n, nrb, sol;
int i, j;
int v[maxn][maxk];
int a[maxk][maxs], sum[maxk][maxs];
int f[maxn][maxk], st[maxn];
inline int max(int a, int b) {
if (a > b)
return a;
return b;
}
void back(int q) {
int i, j, sp, val;
if (q == n) {
sp = 0;
for (i = 1; i <= k; i++)
sp += f[n][i];
if (sp <= s) {
if (nrb % 2 == 1)
sol = sol - sum[k][s - sp];
else
sol = (sol + sum[k][s - sp]) % mod;
if (sol < 0)
sol += mod;
}
}
else {
for (i = 0; i < 2; i++) {
st[q + 1] = i;
for (j = 1; j <= k; j++)
f[q + 1][j] = max(f[q][j], v[q + 1][j] * i);
nrb += i;
back(q + 1);
nrb -= i;
}
}
}
int main() {
freopen("cowfood.in", "r", stdin);
freopen("cowfood.out", "w", stdout);
scanf("%d%d%d", &k, &s, &n);
for (i = 1; i <= n; i++)
for (j = 1; j <= k; j++)
scanf("%d", &v[i][j]);
a[1][0] = sum[1][0] = 1;
for (i = 1; i <= s; i++) {
a[1][i] = 1;
sum[1][i] = (sum[1][i - 1] + 1) % mod;
}
for (i = 2; i <= k; i++) {
a[i][0] = sum[i][0] = 1;
for (j = 1; j <= s; j++) {
a[i][j] = sum[i - 1][j];
sum[i][j] = (sum[i][j - 1] + a[i][j]) % mod;
}
}
back(0);
sol = sol - (k * s + 1); //le scad pe cele care sunt cu 0
if (sol < 0)
sol += mod;
printf("%d\n", sol);
return 0;
}