Cod sursa(job #2338798)

Utilizator triscacezarTrisca Vicol Cezar triscacezar Data 7 februarie 2019 20:27:25
Problema Cowfood Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <bits/stdc++.h>
#define Int long long

using namespace std;

ifstream f("cowfood.in");
ofstream g("cowfood.out");

const Int mod=3210121;

int k,s,n,i,j,ans,a[25][35];
Int fac[20010];

Int put(Int b,int e)
{
    Int ret=1;
    while(e)
    {
        if(e&1)
            ret=(ret*b)%mod;
        b=(b*b)%mod;
        e>>=1;
    }
    return ret;
}

int C(int n,int k)
{
    Int ret=(fac[n]*put(fac[k],mod-2))%mod;
    //cout<<n<<' '<<k<<" : "<<fac[n]<<' '<<fac[k]<<' '<<fac[n-k]<<'\n';
    return (ret*put(fac[n-k],mod-2))%mod;
}

int main()
{
    f>>k>>s>>n;
    fac[0]=1;
    for(i=1; i<=s+k; i++)
        fac[i]=(fac[i-1]*i)%mod;
    for(i=1; i<=n; i++)
        for(j=1; j<=k; j++)
            f>>a[i][j];

    for(int mask=1;mask<(1<<n);mask++)
    {
        int sum=0;
        for(i=1; i<=k; i++)
        {
            int aux=0;
            for(j=1;j<=n;j++)
                if((1<<(j-1))&mask)
                    aux=max(aux,a[j][i]);
            sum+=aux;
        }
        if(sum>s)
            continue;
        int auxx=0;
        int maskk=mask;
        while(maskk)
        {
            if(maskk&1)
                auxx++;
            maskk>>=1;
        }
        if(auxx&1)
        {
            int aux=C(s-sum+k,k);
            ans=(aux+ans>=mod)?aux+ans-mod:aux+ans;
        }
        else
        {
            int aux=C(s-sum+k,k);
            ans=(ans-aux<0)?ans-aux+mod:ans-aux;
        }
    }










    ans=(C(s+k,k)-ans+mod)%mod;
    ans-=k*s+1;
    g<<(ans%mod+mod)%mod;
    return 0;
}