Cod sursa(job #2037128)

Utilizator ionanghelinaIonut Anghelina ionanghelina Data 11 octombrie 2017 19:27:52
Problema Cowfood Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include<bits/stdc++.h>
#define maxS 10005
#define maxK 35
#define MOD 3210121
using namespace std;
int st[maxK],dp[maxK][maxS],e[maxK],k,n,s,sol,a[maxK][maxK];
inline void bktr(int p,int e[],int nr)
{
    if(p==n+1)
    {
         int sum=0;
        for(int j=1;j<=k;j++)
        {
            sum=sum+e[j];
        }
        if(sum>s) return;
        if(!(nr%2)) sol=sol+dp[k][s-sum];
                else sol=sol-dp[k][s-sum];
        while(sol>=MOD) sol-=MOD;
        while(sol<0) sol+=MOD;
        return;
    }
    bktr(p+1,e,nr);
    int e2[maxK];
    for(int i=1;i<=k;i++) e2[i]=max(e[i],a[p][i]);
    bktr(p+1,e2,nr+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",&a[i][j]);
        }
    }
    for(int i=0;i<=s+1;i++)
    {
        dp[0][i]=1;
    }

    for(int i=1;i<=k+1;i++)
    {
        for(int j=0;j<=s+1;j++)
        {
            if(!j) dp[i][j]=dp[i-1][j];
                else dp[i][j]=dp[i-1][j]+dp[i][j-1];
            while(dp[i][j]>=MOD) dp[i][j]-=MOD;
        }
    }

    bktr(1,e,0);
    sol-=(1+s*k);
    while(sol<0) sol+=MOD;
    printf("%d\n",sol);
    return 0;

}