Pagini recente » Cod sursa (job #450761) | Cod sursa (job #2625754) | Cod sursa (job #1335305) | Cod sursa (job #1485569) | Cod sursa (job #483280)
Cod sursa(job #483280)
#include <algorithm>
#include <stdio.h>
#define restRez 3210121
using namespace std;
int k, s, n;
int sol;
int cant[32][32];
int sf[32];
int sum[32][10024];
inline int maxim(int x, int y)
{
if (x > y)
return x;
return y;
}
inline void back(int level, int semn, int *act)
{
if (level == n)
{
int sa = s;
for (int i = 1; i <= k; i++)
sa -= act[i];
if (sa >= 0)
sol = (sol + semn * sf[sa]) % restRez;
return;
}
int past[32];
for (int i = 1; i <= k; i++)
past[i] = act[i];
back(level + 1, semn, past);
for (int i = 1; i <= k; i++)
act[i] = maxim(act[i], cant[level][i]);
back(level + 1, semn * (-1), act);
}
int main()
{
freopen("cowfood.in", "r", stdin);
freopen("cowfood.out", "w", stdout);
scanf("%d %d %d", &k, &s, &n);
for (int i = 0; i < n; i++)
for (int j = 1; j <= k; j++)
scanf("%d", &cant[i][j]);
sum[0][0] = 1;
for (int i = 1; i <= k; i++)
for (int j = 0, sumP = 0; j <= s; j++)
{
sumP = (sumP + sum[i - 1][j]) % restRez;
sum[i][j] = sumP;
}
sf[0] = sum[k][0];
for (int i = 1; i <= s; i++)
sf[i] = (sf[i - 1] + sum[k][i]) % restRez;
sol = restRez - (k * s + 1) % restRez;
int act[32];
memset(act, 0, sizeof(act));
back(0, 1, act);
printf("%d\n", sol);
fclose(stdin);
fclose(stdout);
return 0;
}