Pagini recente » Cod sursa (job #1294741) | Cod sursa (job #2244579) | Cod sursa (job #1017731) | Cod sursa (job #94583) | Cod sursa (job #2410044)
#include <bits/stdc++.h>
#define Nmax 20
#define Smax 10000
#define Kmax 30
#define MOD 3210121
using namespace std;
ifstream fin("cowfood.in");
ofstream fout("cowfood.out");
int N, K, S;
int A[Nmax][Kmax + 5];
int V[Kmax + 5];
int ans;
int dp[Kmax + 5][Smax + 5];
int C[Kmax + 5][Kmax + 5];
int cntBits(int conf)
{
int ret = 0;
while(conf != 0)
{
ret++;
conf &= conf - 1;
}
return ret;
}
int CNT(int S)
{
if(S < 0)
return 0;
return dp[K][S];
}
int main()
{
fin >> K >> S >> N;
for(int i = 0; i < N; i++)
for(int j = 1; j <= K; j++)
fin >> A[i][j];
for(int i = 1; i <= K; i++)
{
dp[i][0] = 1;
for(int j = 1; j <= S; j++)
if(i == 1)
dp[i][j] = 1;
else
dp[i][j] = (dp[i - 1][j] + dp[i][j - 1]) % MOD;
}
C[0][0] = 1;
for(int i = 1; i <= K; i++)
{
C[i][0] = 1;
for(int j = 1; j <= K; j++)
C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % MOD;
}
for(int i = 1; i <= K; i++)
for(int j = 1; j <= S; j++)
dp[i][j] += dp[i][j - 1];
for(int i = 2; i <= K; i++)
if(i % 2 == 0)
ans = (ans + 1ll * C[K][i] * CNT(S - i) % MOD) % MOD;
else
ans = (ans - 1ll * C[K][i] * CNT(S - i) % MOD) % MOD;
for(int conf = 1; conf < (1 << N); conf++)
{
for(int j = 1; j <= K; j++)
V[j] = 0;
for(int bit = 0; bit < N; bit++)
if(conf & (1 << bit))
for(int j = 1; j <= K; j++)
V[j] = max(V[j], A[bit][j]);
int newS = S;
for(int j = 1; j <= K; j++)
newS -= V[j];
if(cntBits(conf) % 2 == 0)
ans = (ans + CNT(newS)) % MOD;
else
ans = (ans - CNT(newS) + MOD) % MOD;
}
fout << ans << "\n";
return 0;
}