Pagini recente » Cod sursa (job #707485) | Cod sursa (job #1814126) | Cod sursa (job #1311462) | Cod sursa (job #767000) | Cod sursa (job #2808801)
#include <bits/stdc++.h>
using namespace std;
#define mod 3210121
ifstream in("cowfood.in");
ofstream out("cowfood.out");
int a[33][33],fact[40501],max1[40];
int lgput(int base, int put){
int ans=1;
for(int i=0;(1<<i)<=put;++i)
{
if(((1<<i)&put)>0)
ans=(1LL*ans*base)%mod;
base=(1LL*base*base)%mod;
}
return ans;
}
int comb(int n,int k){
return (1LL*((1LL*fact[n]*lgput(fact[k],mod-2))%mod)*lgput(fact[n-k],mod-2))%mod;
}
int main()
{
int n,k,S,sum,total,scazut,bits,i,j,z,nr,semn;
in>>k>>S>>n;
fact[0]=1;
fact[1]=1;
for(i=2;i<=40000;++i)
fact[i]=(1LL*fact[i-1]*i)%mod;
for(i=1;i<=n;++i)
for(j=1;j<=k;++j){
in>>a[i][j];
a[i][0]+=a[i][j];
}
scazut=0;
total=0;
for(i=k;i<=S;++i)
total=(1LL*total+1LL*comb(i-1,k-1))%mod;
scazut=0;
int mask;
///calc cat trb sa scad din total
for(mask=1;mask<(1<<n);++mask){
memset(max1,0,sizeof(max1));
bits=0;
///vad ce configuratii din cele n date iau (ce submultime)
for(j=1;j<=n;++j)
if((1<<(j-1)&mask)>0)
{
///calc intersectia
++bits;
for(z=1;z<=k;++z)
max1[z]=max(max1[z],a[j][z]);
}
nr=0;
///daca e nr imp de submultimi e cu + in fata daca nu e cu - in fata
semn=-1;
if(bits%2==1)
semn=1;
///calc suma intersectiei
sum=0;
for(z=1;z<=k;++z)
sum+=max1[z];
///daca suma e buna calc cate am in plus din intersectie
if(sum<=S)
{
for(j=0;j<=S-sum;++j)
nr=(1LL*nr+1LL*comb(j+k-1,k-1))%mod;
scazut=(1ll*scazut+1LL*semn*nr+1LL*mod)%mod;
}
}
out<<(total-scazut+mod)%mod;
return 0;
}