Cod sursa(job #1430471)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 8 mai 2015 15:09:54
Problema Cowfood Scor 54
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <cstdio>
#include <algorithm>
#define MOD 3210121
#define INF 2000000000
#define Nmax 35

using namespace std;

int a[Nmax][Nmax],v[Nmax],n,comb[15000][50],sum[15000][50];

int main()
{
    int sol=0,i,j,kkt,s,k,stare;
    freopen ("cowfood.in","r",stdin);
    freopen ("cowfood.out","w",stdout);
    scanf("%d%d%d", &k,&s,&n);
    for(i=1;i<=s+Nmax;++i)
    {
        comb[i][0]=1;
        sum[i][0]=sum[i-1][0]+1;
        if(sum[i][0]>=MOD) sum[i][0]-=MOD;
    }
    comb[1][1]=sum[1][1]=1;
    for(i=2;i<=s+Nmax;++i)
        for(j=1;j<=40;++j)
        {
            comb[i][j]=comb[i-1][j-1]+comb[i-1][j];
            if(comb[i][j]>=MOD) comb[i][j]-=MOD;
            sum[i][j]=sum[i-1][j]+comb[i][j];
            if(sum[i][j]>=MOD) sum[i][j]-=MOD;
        }
    for(i=0;i<=s;++i)
    {
        sol+=comb[i+k-1][k-1];
        if(sol>=MOD) sol-=MOD;
    }
    for(i=1;i<=n;++i)
        for(j=1;j<=k;++j) scanf("%d", &a[i][j]);
    for(stare=1;stare<(1<<n);++stare)
    {
        int cnt=0;
        for(i=1;i<=k;++i) v[i]=-INF;
        for(j=0;j<n;++j)
            if((1<<j)&stare)
            {
                ++cnt;
                for(kkt=1;kkt<=k;++kkt) v[kkt]=max(v[kkt],a[j+1][kkt]);
            }
        int S=0,aux;
        for(kkt=1;kkt<=k;++kkt) S+=v[kkt];
        if(cnt&1)
        {
            if(s<S) continue;
            aux=sum[max(s-S+k-1,0)][k-1]-sum[max(k-2,0)][k-1];
            if(aux<0) aux+=MOD;
            sol-=aux;
            if(sol<0) sol+=MOD;
        }
        else
        {
            if(s<S) continue;
            aux=sum[max(s-S+k-1,0)][k-1]-sum[max(k-2,0)][k-1];
            if(aux<0) aux+=MOD;
            sol+=aux;
            if(sol>=MOD) sol-=MOD;
        }
    }
    sol=sol-1-k*s;
    while(sol<0) sol+=MOD;
    printf("%d\n", sol);
    return 0;
}