Cod sursa(job #1670819)

Utilizator george_stelianChichirim George george_stelian Data 1 aprilie 2016 01:26:15
Problema Cowfood Scor 18
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <cstdio>
#include <algorithm>

using namespace std;

const int mod=3210121;
int v[25][35],fact[10100],comb[10100],v1[35];

int rid_put(int a,int n)
{
    int p=1;
    for(int i=1;i<=n;i<<=1)
    {
        if(n&i) p=(1LL*p*a)%mod;
        a=(1LL*a*a)%mod;
    }
    return p;
}

int main()
{
    freopen("cowfood.in", "r", stdin);
    freopen("cowfood.out", "w", stdout);
    int k,s,n,sol=0;
    scanf("%d%d%d",&k,&s,&n);
    for(int i=0;i<n;i++)
        for(int j=1;j<=k;j++) scanf("%d",&v[i][j]);
    fact[0]=1;
    for(int i=1;i<=s+k;i++) fact[i]=(1LL*fact[i-1]*i)%mod;
    for(int i=k;i<=s+k;i++)
        comb[i]=(1LL*fact[i]*rid_put((1LL*fact[k]*fact[i-k])%mod,mod-2))%mod;
    int lim=1<<n;
    for(int mask=1;mask<lim;mask++)
    {
        int nr=0,a=s+k;
        for(int i=1;i<=k;i++) v1[i]=0;
        for(int i=0;i<n;i++)
            if(mask&(1<<i))
            {
                nr++;
                for(int j=1;j<=k;j++) v1[j]=max(v1[j],v[i][j]);
            }
        for(int i=1;i<=k;i++) a-=v1[i];
        if(nr&1) sol+=comb[a];
        else sol-=comb[a];
        if(sol>=mod) sol-=mod;
        if(s<0) sol+=mod;
    }
    sol=(comb[s]-sol+mod)%mod;
    printf("%d",sol);
    return 0;
}