Pagini recente » Cod sursa (job #1854186) | Cod sursa (job #2140430) | Cod sursa (job #2355650) | Cod sursa (job #702582) | Cod sursa (job #2707315)
#include <iostream>
#include <fstream>
#define MOD 3210121
#define ll long long
#define NMAX 2000
using namespace std;
ifstream fin("cowfood.in");
ofstream fout("cowfood.out");
int k, s, n, a[25][35], ans;
ll fact[NMAX+10];
void precalc()
{ fact[0] = 1;
for(int i=1; i<=NMAX; i++)
fact[i] = fact[i-1] * i % MOD;
}
ll lgput(ll a, ll n)
{ if(!n) return 1;
if(n % 2 == 0) return lgput(a*a % MOD, n/2);
return a * lgput(a*a % MOD, n/2) % MOD;
}
int C(int n, int k)
{ ll val1 = fact[n], val2 = fact[k] * fact[n-k] % MOD;
return val1 * lgput(val2, MOD - 2) % MOD;
}
int main()
{
fin >> k >> s >> n;
precalc();
for(int i=1; i<=n; i++)
for(int j=1; j<=k; j++)
fin >> a[i][j];
for(int mask=1; mask<(1<<n); mask++)
{ int cnt = 0, v[35] = {0};
for(int bit=0; bit<n; bit++)
if(mask & (1 << bit))
{ cnt++;
for(int j=1; j<=k; j++)
v[j] = max(v[j], a[bit+1][j]);
}
int sum = 0;
for(int i=1; i<=k; i++)
sum += v[i];
if(sum > s) continue;
if(cnt % 2 == 0)
ans = (ans - C(s - sum + k, k) + MOD) % MOD;
else
ans = (ans + C(s - sum + k, k)) % MOD;
}
fout << (C(s + k, k) - s * k - 1 - ans + MOD) % MOD << '\n';
return 0;
}