Pagini recente » Cod sursa (job #80206) | Cod sursa (job #638118) | Cod sursa (job #44938) | Cod sursa (job #1358463) | Cod sursa (job #2404728)
#include <fstream>
using namespace std;
ifstream fin("cowfood.in");
ofstream fout("cowfood.out");
const int KMAX = 30;
const int SMAX = 10000;
const int NMAX = 20;
const int MOD = 3210121;
int K, S, N;
int v[NMAX + 5][KMAX + 5];
int dp[KMAX + 5][SMAX + 5];
int a[KMAX + 5], cpy[KMAX + 5];
int invalid;
void BK(int nivel, int used)
{
if(nivel == N + 1)
{
if(used == 0 || a[0] > S)
return ;
if(used % 2 == 1)
invalid = (invalid + dp[K][S - a[0]]) % MOD;
else
invalid = (invalid - dp[K][S - a[0]] + 2 * MOD) % MOD;
return ;
}
BK(nivel + 1, used);
for(int i = 0; i <= K; i++)
cpy[i] = a[i];
for(int i = 1; i <= K; i++)
{
a[0] -= a[i];
a[i] = max(a[i], v[nivel][i]);
a[0] += a[i];
}
BK(nivel + 1, used + 1);
for(int i = 0; i <= K; i++)
a[i] = cpy[i];
}
int main()
{
fin >> K >> S >> N;
for(int i = 1; i <= N; i++)
for(int j = 1; j <= K; j++)
fin >> v[i][j];
for(int j = 0; j <= S; j++)
dp[1][j] = 1;
for(int i = 2; i <= K; i++)
{
dp[i][0] = 1;
for(int j = 1; j <= S; j++)
dp[i][j] = (dp[i - 1][j] + dp[i][j - 1]) % MOD;
}
for(int i = 1; i <= S; i++)
dp[K][i] = (dp[K][i] + dp[K][i - 1]) % MOD;
BK(1, 0);
int total = (dp[K][S] - 1 - (K * S) % MOD + 2 * MOD) % MOD;
fout << (total - invalid + MOD) % MOD << '\n';
return 0;
}