Cod sursa(job #3368387)

Utilizator vladneaguVladneagu vladneagu Data 14 octombrie 2026 13:12:18
Problema Cowfood Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.89 kb
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=25;
int k,s,n;
vector<int> v[maxn];
const int mod=3210121;
const int maxs=4e4+5;
int fact[maxs+5];
int inv[maxs+5];
int binpow(int val,int put) {
    if (put==0) return 1;
    int ans=binpow(val,put/2);
    if (put%2==0) return (ans*ans)%mod;
    return (ans*ans)%mod*val%mod;
}
int combi(int n,int k) {
    //cout<<n<<endl;
    //cout<<fact[n]<<" "<<inv[k]<<" " <<inv[n-k]<<endl;
    return (fact[n]*inv[k])%mod*inv[n-k]%mod;
}
int stars_and_bars(int n,int k) {
    if (n<0) return 0;
    return combi(n+k,k)%mod;
}
signed main() {
    ifstream cin("cowfood.in");
    ofstream cout("cowfood.out");
    cin>>k>>s>>n;
    fact[0]=1;
    for (int i=1;i<=maxs;i++) {
        fact[i]=(fact[i-1]*i)%mod;
    }
    //cout<<fact[s]<<endl;
    inv[s]=binpow(fact[maxs],mod-2);
    for (int i=maxs-1;i>=0;i--) {
        inv[i]=(inv[i+1]*(i+1))%mod;
    }
    for (int i=0;i<n;i++) {
        for (int j=1;j<=k;j++) {
            int x;
            cin>>x;
            v[i].push_back(x);
        }
    }
    int ans=stars_and_bars(s,k)-k*s-1;
    //cout<<stars_and_bars(5,2)<<endl;
    for (int i=1;i<(1<<n);i++) {
        int suma=0;
        //cout<<i<<endl;
        for (int teta=0;teta<k;teta++) {
            int maxi=0;
            for (int j=0;j<n;j++) {
                if ((1<<j)&i)maxi=max(maxi,v[j][teta]);
            }
            suma+=maxi;
            //cout<<teta<<" "<<maxi<<endl;
            if (suma>s)break;
        }
        if (suma>s)continue;
        //cout<<i<<" "<<suma<<endl;
        if (__builtin_popcount(i)%2==0) {
            //cout<<stars_and_bars(s-suma,k)<<endl;
            ans+=stars_and_bars(s-suma,k);
            ans%=mod;
        }else {
            //cout<<stars_and_bars(s-suma,k)<<endl;
            ans-=stars_and_bars(s-suma,k);
            ans+=mod;
            ans%=mod;
        }
    }
    cout<<ans;
    return 0;
}