Cod sursa(job #1936858)

Utilizator ionanghelinaIonut Anghelina ionanghelina Data 23 martie 2017 15:17:43
Problema Cowfood Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include<bits/stdc++.h>
#define MOD 3210121
#define maxK 35
#define maxS 10005
using namespace std;
int n,k,s,vect[maxK],st[maxK],a[maxK][maxK],dp[maxK][maxS];
long long sol;
inline int min(int a,int b)
{
    return a<b?a:b;
}
void Solve(int p,int sum)
{
    for(int i=1;i<=k;i++)
        vect[i]=INT_MAX;
    for(int i=1;i<=n;i++)
    {
        if(!st[i]) return;
        for(int j=1;j<=k;j++)
        {
            vect[i]=min(vect[i],a[i][j]);
        }
    }
    //dp[i][j]-numarul de experimente cu primele i ierburi care au suma elementelor j
    for(int i=1;i<=k;i++)
    {
        for(int j=1;j<=s;j++) dp[i][j]=0;
    }
    dp[0][0]=1;
    for(int i=0;i<k;i++)
    {
        for(int j=0;j<=vect[i];j++)
            for(int t=0;(t+j)<=sum;t++)
            {
                dp[i][j+t]+=dp[i-1][j];
                dp[i][j+t]%=MOD;
            }
    }
    long long s=0;
    for(int i=2;i<=sum;i++)
    {
        s=(s+dp[n][i])%MOD;
    }
    if(s&1) sol+=s;
        else sol-=s;
}
void bktr(int p,int sum)
{
    for(int i=0;i<=1;i++)
    {
        st[p]=i;
        s=sum+i;
        if(p==n)
        {
            if(s<=1) return;
            Solve(p,s);
        }
            else bktr(p+1,s+i);
    }
}
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",&a[i][j]);
        }
    }
    long long p=1LL;
    for(int i=1;i<=n;i++)
    {
        p=(p*2LL)%MOD;
    }
    bktr(1,0);
    printf("%lld\n",p-sol);
    return 0;
}