Pagini recente » Cod sursa (job #1052906) | Cod sursa (job #258104) | Cod sursa (job #1244298) | Cod sursa (job #2281280) | Cod sursa (job #192156)
Cod sursa(job #192156)
#include <stdio.h>
#include <string>
#define maxn 35
#define maxs 10010
#define maxx 1048576
#define us unsigned short
#define max(a,b) (a > b ? a : b)
#define mod 3210121
int n, m, s, sol, semn;
int a[maxn][maxn];
int c[maxs], d[maxs];
int v[maxn];
void back(int k)
{
if (k == n)
{
int S = s, i;
for (i=1; i<=m; i++) S -= v[i];
if (S < 0) return;
sol += c[S] * semn;
if (sol > mod) sol -= mod;
if (sol < 0) sol += mod;
}
else {
back(k+1);
int aux[maxn], i, S = s;
memcpy(aux, v, sizeof(v));
for (i=0; i<=m; i++)
{
if (a[k][i] > v[i]) v[i] = a[k][i];
S -= v[i];
}
semn = -semn;
if (S > 0) back(k+1);
semn = -semn;
memcpy(v, aux, sizeof(aux));
}
}
int main()
{
freopen("cowfood.in", "r", stdin);
freopen("cowfood.out", "w", stdout);
scanf("%d %d %d ", &m, &s, &n);
int i, j;
for (i=0; i<n; i++)
for (j=1; j<=m; j++) scanf("%d ", &a[i][j]);
c[0] = 1;
for (i=0; i<m; i++)
{
memcpy(d, c, sizeof(c));
memset(c, 0, sizeof(c));
c[0] = 1;
for (j=1; j<=s; j++)
{
c[j] = d[j] + c[j-1];
if (c[j] >= mod) c[j] -= mod;
}
}
for (i=1; i<=s; i++)
{
c[i] += c[i-1];
if (c[i] >= mod) c[i] -= mod;
}
semn = 1;
back(0);
sol = (sol - m*s - 1) % mod;
if (sol < 0) sol += mod;
printf("%d\n", sol);
return 0;
}