Cod sursa(job #3347592)

Utilizator MegaCoderMinoiu Teodor Mihai MegaCoder Data 17 martie 2026 12:45:36
Problema Cowfood Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.07 kb
#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;
}