Pagini recente » Cod sursa (job #279443) | Cod sursa (job #3123605) | Cod sursa (job #2587610) | Cod sursa (job #696334) | Cod sursa (job #1494374)
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxN 22
#define maxS 10002
#define maxK 32
#define mod 3210121
using namespace std;
int n, s, k, j, dp[maxS][maxK], nb1;
int a[maxN][maxK], b[maxN][maxK], sol;
void read()
{
int i;
freopen("cowfood.in", "r", stdin);
scanf("%d %d %d", &k, &s, &n);
for (i = 0; i < n; ++ i)
for (j = 1; j <= k; ++ j)
scanf("%d", &a[i][j]);
}
void DP()
{
int i;
for (i = 0; i <= k + 1; ++ i)
dp[0][i] = 1;
for (j = 1; j <= s; ++ j)
{
for (i = 1; i <= k + 1; ++ i)
{
dp[j][i] = dp[j][i - 1] + dp[j - 1][i];
if (dp[j][i] > mod)
dp[j][i] -= mod;
}
}
sol = dp[s][k + 1] - 1 - k * s;
if (sol < 0)
sol += mod;
}
void back(int x)
{
int i, sum = 0;
if (x == n)
{
sum = b[x][0];
if (sum <= s && nb1)
{
if (nb1 % 2)
sol -= dp[s - sum][k + 1];
else
sol += dp[s - sum][k + 1];
if (sol > mod)
sol -= mod;
if (sol < 0)
sol += mod;
}
return ;
}
for (i = 1; i <= k; ++ i)
b[x + 1][i] = b[x][i];
b[x + 1][0] = b[x][0];
back(x + 1);
b[x + 1][0] = 0;
for (i = 1; i <= k; ++i)
{
b[x + 1][i] = max(b[x][i], a[x][i]);
b[x + 1][0] += b[x + 1][i];
}
++ nb1;
back(x + 1);
-- nb1;
}
void solve()
{
DP();
back(0);
}
void write()
{
freopen("cowfood.out", "w", stdout);
printf("%d", sol);
}
int main()
{
read();
solve();
write();
return 0;
}