Pagini recente » Cod sursa (job #2730606) | Cod sursa (job #1908617) | Cod sursa (job #51062) | Cod sursa (job #2389816) | Cod sursa (job #3202251)
#include <iostream>
#define int long long
using namespace std;
const int N = 35, mod = 3210121;
int n, k, s, ans, maxi[N], fact[2*N], a[N][N];
int binpow(int baza, int exp) {
if(!exp)
return 1;
long long p = binpow(baza, exp/2);
if(exp & 1)
return p * p % mod * baza % mod;
else return p * p % mod;
}
int inv_mod(int a, int b) {
return a * binpow(b, mod-2) % mod;
}
int comb(int n, int k) {
return inv_mod(fact[n], fact[k] * fact[n-k] % mod);
}
int sb(int n, int k) {
return comb(n+k-1, k-1);
}
int32_t main()
{
freopen("cowfood.in", "r", stdin);
freopen("cowfood.out", "w", stdout);
fact[0] = 1;
for(int i=1; i<2*N; i++)
fact[i] = fact[i-1] * i % mod;
cin >> k >> s >> n;
for(int i=1; i<=n; i++)
for(int j=1; j<=k; j++)
cin >> a[i][j];
for(int j=1; j<=(1<<n)-1; j++) {
for(int i=1; i<=k; i++)
maxi[i] = -1;
for(int i=1; i<=n; i++)
if(j & (1 << (i - 1))) {
for(int l=1; l<=k; l++)
maxi[l] = max(maxi[l], a[i][l]);
}
int sum = 0;
for(int i=1; i<=k; i++)
sum = (sum + maxi[i]) % mod;
if(__builtin_popcount(j) & 1) {
if(sum < s)
ans = (ans + sb(s-sum, k+1)) % mod;
else if (sum <= s)
ans = (ans + 1) % mod;
}
else {
if(sum < s)
ans = (ans - sb(s-sum, k+1) + mod);
else if(sum <= s)
ans = (ans - 1 + mod) % mod;
}
}
cout << (sb(s-k, k+1) - ans + mod) % mod;
return 0;
}