Cod sursa(job #1834922)

Utilizator LucianTLucian Trepteanu LucianT Data 25 decembrie 2016 21:09:12
Problema Cowfood Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <bits/stdc++.h>
#define maxN 23
#define maxK 33
#define maxS 10002
#define MOD 3210121
using namespace std;
int n,k,s,i,j,sol,maxx[maxK];
int a[maxN][maxK],b[maxN][maxK];
int dp[maxK][maxS];
void bkt(int p,int _sign)
{
    if(p==n+1)
    {
        int sum=0;
        for(int i=1;i<=k;i++)
            sum+=maxx[i];
        if(sum<=s)
            sol=(sol+MOD+_sign*dp[k][s-sum])%MOD;
        return;
    }
    bkt(p+1,_sign);
    for(int i=1;i<=k;i++)
        b[p][i]=maxx[i],
        maxx[i]=max(maxx[i],a[p][i]);
    bkt(p+1,-_sign);
    for(int i=1;i<=k;i++)
        maxx[i]=b[p][i];
}
int main()
{
    freopen("cowfood.in","r",stdin);
    freopen("cowfood.out","w",stdout);
    scanf("%d %d %d",&k,&s,&n);
    for(i=1;i<=n;i++)
        for(j=1;j<=k;j++)
            scanf("%d",&a[i][j]);
    for(i=0;i<=s;i++)
        dp[0][i]=1;
    for(i=1;i<=k;i++)
    {
        dp[i][0]=1;
        for(j=1;j<=s;j++)
        {
            dp[i][j]=dp[i-1][j]+dp[i][j-1];
            while(dp[i][j]>=MOD)
                dp[i][j]-=MOD;
        }
    }
    bkt(1,1);
    sol=(sol-s*k-1+MOD)%MOD;
    printf("%d",sol);
    return 0;
}