Pagini recente » Cod sursa (job #1845940) | Cod sursa (job #1102673) | Cod sursa (job #1781171) | Cod sursa (job #1895464) | Cod sursa (job #3347592)
#include<fstream>
#include<vector>
#define mod 3210121
#define ll long long
std::ifstream fin("cowfood.in");
std::ofstream fout("cowfood.out");
const int SMAX=10050;
ll fact[SMAX], inv[SMAX], failed;
int k, s, n;
std::vector<std::vector<int>>experiments;
inline ll lgexp(ll base, ll exp)
{
ll p=1;
while(exp)
{
if(exp&1)
p=(p*base)%mod;
base=(base*base)%mod;
exp>>=1;
}
return p;
}
inline void precalc()
{
fact[0]=fact[1]=1;
for(int i=2; i<SMAX; ++i)
fact[i]=(fact[i-1]*i)%mod;
inv[SMAX-1]=lgexp(fact[SMAX-1], mod-2);
for(int i=SMAX-2; i>=0; --i)
inv[i]=(inv[i+1]*(i+1))%mod;
}
inline ll C(ll N, ll K)
{
if(K==0)
return 1;
ll upper=fact[N];
ll lower=(inv[K]*inv[N-K])%mod;
ll ans=(upper*lower)%mod;
return ans;
}
void read()
{
fin>>k>>s>>n;
for(int i=0; i<n; ++i)
{
std::vector<int>local;
for(int j=0; j<k; ++j)
{
int val;
fin>>val;
local.push_back(val);
}
experiments.push_back(local);
}
}
void combine(std::vector<int>&local, int bit)
{
for(int i=0; i<k; ++i)
local[i]=std::max(local[i], experiments[bit][i]);
}
ll count_greater(std::vector<int>&local)
{
ll cnt=0;
for(int i=0; i<k; ++i)
cnt+=local[i];
ll rem=s-cnt;
if(rem<0)return 0;
ll greater=C(rem+k, k); //putting at most rem units in k boxes
return greater;
}
void get_failed(int pos, int bits, std::vector<int>max)
{
if(pos==n)
{
if(bits==0)return;
int sign=(bits%2)?1:-1;
ll cnt= count_greater(max);
failed=(failed+sign*cnt+mod)%mod;
return;
}
get_failed(pos+1, bits, max);
for(int i=0; i<k; ++i)
max[i]=std::max(max[i], experiments[pos][i]);
get_failed(pos+1, bits+1, max);
}
void solve()
{
ll total=C(s+k, k);
total=(total-s*k-1+mod)%mod;
std::vector<int>max(k+1, 0);
get_failed(0, 0, max);
ll ans=(total-failed+mod)%mod;
fout<<ans;
}
int main()
{
precalc();
read();
solve();
return 0;
}