Pagini recente » Cod sursa (job #3339713) | Cod sursa (job #2801262) | Cod sursa (job #1990109) | Cod sursa (job #997447) | Cod sursa (job #3332083)
#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 C[20001][31];
void pascal()
{
C[0][0]=1;
for (int i=1;i<=20000;i++)
{
C[i][0]=1;
for (int j=1;j<=min(i,k);j++)
C[i][j]=(C[i-1][j-1]+C[i-1][j])%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=(C[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);
int A[31] = {0};
long long suma = 0;
for (int x=mask; x; x&=(x-1))
{
int i=__builtin_ctz(x)+1;
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=C[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;
}