Pagini recente » Cod sursa (job #618529) | Cod sursa (job #279745) | Cod sursa (job #1346468) | Cod sursa (job #2803157) | Cod sursa (job #937098)
Cod sursa(job #937098)
#include <cstring>
#include <fstream>
#include <algorithm>
using namespace std;
const int MOD = 3210121;
int K, S, N;
int A[22][32];
int fact[20002], invfact[20002];
int D[10002], E[10002];
int result;
int power(int x, int y)
{
if (y == 0) return 1;
if (y & 1) return 1LL * x * power(1LL * x * x % MOD, y >> 1) % MOD;
return power(1LL * x * x % MOD, y >> 1);
}
int COMB(int x, int y)
{
int resnow = fact[x];
resnow = 1LL * resnow * invfact[y] % MOD;
resnow = 1LL * resnow * invfact[x - y] % MOD;
return resnow;
}
int main()
{
ifstream fin("cowfood.in");
ofstream fout("cowfood.out");
fact[0] = 1;
invfact[0] = 1;
for (int i = 1; i <= 20000; ++i)
{
fact[i] = 1LL * fact[i - 1] * i % MOD;
invfact[i] = 1LL * invfact[i - 1] * power(i, MOD - 2) % MOD;
}
fin >> K >> S >> N;
for (int i = 1; i <= N; ++i)
for (int j = 1; j <= K; ++j)
fin >> A[i][j];
D[0] = 1;
E[0] = 0;
for (int i = 1; i <= S; ++i)
{
D[i] = D[i - 1] + COMB(i + K - 1, K - 1);
if (D[i] >= MOD) D[i] -= MOD;
E[i] = E[i - 1] + COMB(i + K - 1, K - 1);
if (E[i] >= MOD) E[i] -= MOD;
E[i] -= K;
if (E[i] < 0) E[i] += MOD;
}
result = E[S];
for (int i = 1; i < (1 << N); ++i)
{
memset(A[0], 0, sizeof(A[0]));
for (int j = 0; j < N; ++j)
if (i & (1 << j))
for (int k = 1; k <= K; ++k)
A[0][k] = max(A[0][k], A[j + 1][k]);
int sumnow = 0;
for (int j = 1; j <= K; ++j)
sumnow += A[0][j];
int remnow = S - sumnow;
if (remnow < 0) continue;
int aux = i, numdig = 0;
while (aux)
{
aux &= aux - 1;
++numdig;
}
if (numdig & 1)
{
result -= D[remnow];
if (result < 0) result += MOD;
}
else
{
result += D[remnow];
if (result >= MOD) result -= MOD;
}
}
fout << result << '\n';
fin.close();
fout.close();
}