Cod sursa(job #2036888)

Utilizator ionanghelinaIonut Anghelina ionanghelina Data 11 octombrie 2017 10:53:00
Problema Cowfood Scor 4
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include<bits/stdc++.h>
#define maxN 25
#define maxK 35
#define maxS 10005
#define MOD 3210121
using namespace std;

int ex[maxN][maxK],n,k,s,e[maxK],st[maxN];
int comb[maxS][maxK],failed;
inline void solve(int p)
{
    int nr=0;
    for(int i=1;i<=k;i++) e[i]=0;
    for(int i=1;i<=n;i++)
    {
        if(!st[i]) continue;
        nr++;
        for(int j=1;j<=k;j++)
        {
            e[j]=max(e[j],ex[i][j]);
        }
    }
    if(!nr) return;
    int sum=0;
    for(int j=1;j<=k;j++)
        sum=sum+e[j];
    int ways=0;
    int cnt=0;
    for(int j=sum;j<=s;j++,cnt++)
    {
        ways=ways+comb[k][cnt];
        if(ways>=MOD) ways-=MOD;
    }
    if(nr%2) failed+=ways;
        else failed-=ways;
    while(failed>=MOD) failed-=MOD;
    while(failed<0) failed+=MOD;

}
inline void bktr(int p)
{
    for(int i=0;i<=1;i++)
    {
        st[p]=i;
        if(p==n) solve(p);
            else bktr(p+1);
    }
}
int main()
{
    freopen("cowfood.in","r",stdin);
    freopen("cowfood.out","w",stdout);
    scanf("%d%d%d",&k,&s,&n);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=k;j++)
            scanf("%d",&ex[i][j]);
    }
    for(int i=0;i<=s;i++) comb[i][0]=1;
    for(int i=1;i<=s;i++)
    {
        for(int j=1;j<=k;j++)
        {
            comb[i][j]=(comb[i-1][j]+comb[i-1][j-1])%MOD;
        }
    }

    bktr(1);

    int sol=comb[s][k]-failed;
    while(sol<0) sol+=MOD;
    printf("%d\n",sol);
    return 0;
}