Cod sursa(job #2036979)

Utilizator georgerapeanuRapeanu George georgerapeanu Data 11 octombrie 2017 15:44:54
Problema Cowfood Scor 58
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 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 N,K,S;
int A[25][35];
int C[10035][35];
int tmp[35];
int main()
{
    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]);
    for(int i=0;i<=S+K;i++)
    {
        C[i][0]=1;if(i<=K)C[i][i]=1;
        for(int j=1;j<i&&j<=K;j++)
        {
            C[i][j]=C[i-1][j]+C[i-1][j-1];
            if(C[i][j]>=MOD)C[i][j]-=MOD;
        }
    }
    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;
}