Pagini recente » Cod sursa (job #2981390) | Cod sursa (job #1663831) | Cod sursa (job #2429927) | Cod sursa (job #1684675) | Cod sursa (job #1492387)
# include <bits/stdc++.h>
using namespace std;
const int mod = 3210121;
ifstream fi("cowfood.in");
ofstream fo("cowfood.out");
int fact[12345];
int invs[12345];
int pow(int a,int b,int mod)
{
int ans = 1;
while (b)
{
if (b&1) ans = (1ll * a * ans) % mod;
a = (1ll * a * a) % mod;
b /= 2;
}
return ans;
}
int C(int n,int k,int mod)
{
return (((1ll * fact[n] * invs[n - k]) % mod) * invs[k]) % mod;
}
int s[12345];
int v[44][44];
const int p_1[] = {1,-1};
int main(void)
{
fact[0] = invs[0] = 1;
for (int i = 1;i <= 1e4+33;++i)
fact[i] = (1ll * fact[i-1] * i) % mod,invs[i] = pow(fact[i],mod - 2,mod);
int n,sum,k;
fi>>k>>sum>>n;
for (int i = 1;i <= 1e4+33;++i)
s[i] = (s[i-1] + C(i-1,k-1,mod)) % mod;
int ans = 0;
for (int i = 1;i <= sum;++i)
ans = (ans + C(i+k-1,k-1,mod)) % mod;
ans = (ans + mod - k*sum) % mod;
for (int i = 0;i < n;++i)
for (int j = 1;j <= k;++j)
fi>>v[i][j];
int tot = 1 << n;
for (int bit = 1;bit < tot;++bit)
{
int p[44];
fill(p+1,p+k+1,0);
int cnt = 0;
for (int i = 0;i < n;++i) cnt += (bit >> i) & 1;
for (int i = 0;i < n;++i)
if ((bit >> i) & 1)
for (int j = 1;j <= k;++j)
p[j] = max(p[j],v[i][j]);
int ss = 0;
for (int i = 1;i <= k;++i)
ss += p[i];
ss = sum - ss;
if (ss >= 0) ans = (ans + mod + p_1[cnt&1] * s[ss+k]) % mod;
}
return fo << ans << '\n',0;
}