Pagini recente » Cod sursa (job #1923998) | Cod sursa (job #708276) | Cod sursa (job #1741562) | Cod sursa (job #2793904) | Cod sursa (job #483275)
Cod sursa(job #483275)
#include <algorithm>
#include <stdio.h>
#define restRez 3210121
#define ll long long
using namespace std;
int k, s, n;
ll 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;
}
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++)
{
int sumP = 0;
for (int j = 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;
for (int i = 0; i < (1 << n); i++)
{
ll semn = 1;
int act[32];
memset(act, 0, sizeof(act));
for (int j = 0; j < n; j++)
if (i & (1 << j))
{
semn *= (ll) -1;
for (int h = 1; h <= k; h++)
act[h] = maxim(act[h], cant[j][h]);
}
int sa = s;
for (int j = 1; j <= k; j++)
sa -= act[j];
if (sa >= 0)
sol = (sol + semn * sf[sa]) % restRez;
}
printf("%lld\n", sol);
fclose(stdin);
fclose(stdout);
return 0;
}