Pagini recente » Cod sursa (job #2915108) | Cod sursa (job #321406) | Cod sursa (job #2243128) | Cod sursa (job #684269) | Cod sursa (job #2404710)
#include <fstream>
using namespace std;
ifstream fin("cowfood.in");
ofstream fout("cowfood.out");
const int NMAX = 20;
const int KMAX = 30;
const int SMAX = 10000;
const int MOD = 3210121;
int K, S, N;
int v[NMAX + 5][KMAX + 5];
int dp[KMAX + 5][SMAX + 5]; ///dp[i][j] = nr moduri de a pune j bile identice in i cutii diferite
int invalid;
int a[KMAX + 5], copie[KMAX + 5];
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]] + MOD) % MOD;
return ;
}
///nu adaugam v[nivel]
BK(nivel + 1, used);
///adaugam v[nivel]
for(int i = 0; i <= K; i++)
copie[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] = copie[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];
///Precompute DP
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; ///dp[K][i] = in cate moduri poti sa pui cel mult i bile in K cutii
BK(1, 0);
fout <<(dp[K][S] - 1 - (K * S) % MOD - invalid + MOD) % MOD;
return 0;
}