Cod sursa(job #1937070)

Utilizator ionanghelinaIonut Anghelina ionanghelina Data 23 martie 2017 17:59:15
Problema Cowfood Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 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],sfinal;
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]=sfinal;
    for(int i=1;i<=n;i++)
    {
        if(st[i])
        {
        for(int j=1;j<=k;j++)
        {
            vect[i]=min(vect[i],a[i][j]);
        }
        }
    }
    dp[0][0]=1;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<=vect[i+1];j++)
        {
            for(int t=0;(j+t)<=sfinal;t++)
            {
                dp[i+1][j+t]+=dp[i][t];
                dp[i+1][j+t]%=MOD;
            }
        }
    }
    int suma=0;
    for(int i=1;i<=sfinal;i++)
    {
        suma=(suma+dp[n][i])%MOD;
    }
    //dp[i][j]-numarul de experimente cu primele i ierburi care au suma elementelor j
    if(sum&1) sol+=suma;
        else sol-=suma;
}
void bktr(int p,int sum)
{
    for(int i=0;i<=1;i++)
    {
        st[p]=i;
        s=sum+i;
        if(p==n)
        {
            if(!s) 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,&sfinal,&n);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=k;j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    sol-=n;
  //  sol--;
    sol%=MOD;
    bktr(1,0);
    printf("%lld\n",sol);
    return 0;
}