Pagini recente » Cod sursa (job #698345) | Cod sursa (job #397694) | Cod sursa (job #1161762) | Cod sursa (job #309042) | Cod sursa (job #3332076)
#include <bits/stdc++.h>
/// Template Dutzu
#define fast ios_base::sync_with_stdio(false);cin.tie(0);
#define MOD 3210121
#define int long long
using namespace std;
ifstream fin("cowfood.in");
ofstream fout("cowfood.out");
int v[21][31];
int f[100001];
bool used[31];
int total;
int k,s;
int expo(int a, int n)
{
int p=1;
while (n)
{
if (n%2)
p=(1LL*p*a)%MOD;
a=(1LL*a*a)%MOD;
n/=2;
}
return p;
}
int comb(int n, int k)
{
long long dem;
dem=f[n];
long long imp;
imp=(1LL*f[k]*f[n-k])%MOD;
imp=expo(imp,MOD-2);
return (1LL*dem*imp)%MOD;
}
int maxim[31];
int A[31];
void bkt(int vf, int& rez, int n)
{
if (vf>n)
{
int cnt=0;
long long suma=0;
memset(A,0,sizeof(A));
for (int i=1; i<=n; i++)
if (used[i]==1)
{
cnt++;
for (int j=1; j<=k; j++)
A[j]=max(A[j],v[i][j]);
}
int difzero=0;
for (int j=1; j<=k; j++)
{
suma+=A[j];
if (A[j]>0)
difzero++;
}
if (cnt==0)
return;
long long r=s-suma;
if (r<0)
return;
long long w=comb(r+k,k);
if (difzero==0)
{
w=(w-1-(1LL*k*r)%MOD+MOD)%MOD;
}
else if (difzero==1)
{
w=(w-r-1+MOD)%MOD;
}
if (cnt%2)
rez=(rez+w)%MOD;
else
rez=(rez-w+MOD)%MOD;
return;
}
bkt(vf+1,rez,n);
used[vf]=1;
bkt(vf+1,rez,n);
used[vf]=0;
}
signed main()
{
fast
int n;
fin>>k>>s>>n;
f[0]=1;
for (int i=1; i<=100000; i++)
f[i]=(1LL*f[i-1]*i)%MOD;
total=(comb(s+k,k)-1-1LL*k*s+MOD)%MOD;
for (int i=1; i<=n; i++)
for (int j=1; j<=k; j++)
fin>>v[i][j];
int rez=0;
for (int mask = 1; mask < (1 << n); mask++)
{
int cnt = __builtin_popcount(mask); // cate experimente alese
int A[31] = {0};
long long suma = 0;
// echivalent cu: for(i=1..n) if(used[i])
for (int x = mask; x; x &= (x - 1))
{
int i = __builtin_ctz(x) + 1; // +1 pentru ca v e 1-based
for (int j = 1; j <= k; j++)
A[j] = max(A[j], v[i][j]);
}
int difzero = 0;
for (int j = 1; j <= k; j++)
{
suma += A[j];
if (A[j] > 0)
difzero++;
}
if (cnt == 0)
continue;
long long r = s - suma;
if (r < 0)
continue;
long long w = comb(r + k, k);
if (difzero == 0)
{
w = (w - 1 - (1LL * k * r) % MOD + MOD) % MOD;
}
else if (difzero == 1)
{
w = (w - r - 1 + MOD) % MOD;
}
if (cnt % 2)
rez = (rez + w) % MOD;
else
rez = (rez - w + MOD) % MOD;
}
fout<<(total-rez+MOD)%MOD;
return 0;
}