Cod sursa(job #2036975)

Utilizator georgerapeanuRapeanu George georgerapeanu Data 11 octombrie 2017 15:40:12
Problema Cowfood Scor 54
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <cstdio>
#include <iostream>
#include <algorithm>
#define MOD 3210121
using namespace std;
FILE *f=fopen("cowfood.in","r");
FILE *g=fopen("cowfood.out","w");
int fact[20005];
int ifact[20005];
int N,K,S;
int A[25][35];
int tmp[35];
int lgpow(int b,int e)
{
    int p=1;
    while(e)
    {
        if(e&1)p=1LL*p*b%MOD;
        b=1LL*b*b%MOD;
        e>>=1;
    }
    return p;
}
int C(int N,int K)
{
    return  1LL*(1LL*fact[N]*ifact[K]%MOD)*ifact[N-K]%MOD;
}
int main()
{
    fact[0]=1;
    for(int i=1;i<=20000;i++)
        fact[i]=1LL*fact[i-1]*i%MOD;
    ifact[20000]=lgpow(fact[20000],MOD-2);
    for(int i=20000-1;i>=0;i--)
        ifact[i]=1LL*ifact[i+1]*(i+1)%MOD;
    fscanf(f,"%d%d%d",&K,&S,&N);
    for(int i=1;i<=N;i++)for(int j=1;j<=K;j++)fscanf(f,"%d",&A[i][j]);
    int ans=C(S+K,K)-1-K*S;
    for(int conf=1;conf<(1<<N);conf++)
    {
        int sgn=1;
        for(int i=1;i<=K;i++)tmp[i]=0;
        for(int i=0;i<N;i++)
        {
            if((conf>>i)&1)
            {
                sgn*=-1;
                for(int j=1;j<=K;j++)
                {
                    tmp[j]=max(tmp[j],A[i+1][j]);
                }
            }
        }
        int s=S;
        for(int i=1;i<=K;i++)s-=tmp[i];
        if(s<0)continue;
        ans+=sgn*C(s+K,K);
        if(ans<0)ans+=MOD;
        if(ans>=MOD)ans-=MOD;
    }
    fprintf(g,"%d",ans);
    fclose(f);
    fclose(g);
    return 0;
}