Cod sursa(job #2413656)

Utilizator 12222Fendt 1000 Vario 12222 Data 23 aprilie 2019 16:50:40
Problema Cowfood Scor 46
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("cowfood.in");
ofstream fout("cowfood.out");

const int Mod=3210121;

int n,k,s,sol;
int x[25];
int a[25][35],dp[35][10005];

void Back(int top,int lg)
{
    if(top==n+1)
    {
        int sum=0;
        for(int i=1;i<=k;i++)
            sum+=x[i];

        if(sum>s || !sum)return ;

        if(lg%2)sol+=dp[k][s-sum];
        else sol-=dp[k][s-sum];

        if(sol>=Mod)sol-=Mod;
        if(sol<0)sol+=Mod;

        return ;
    }

    int aux[25];

    for(int i=1;i<=k;i++)
        aux[i]=x[i];

    Back(top+1,lg);

    for(int i=1;i<=k;i++)
        x[i]=aux[i];

    for(int i=1;i<=k;i++)
        x[i]=max(x[i],a[top][i]);

    Back(top+1,lg+1);

    for(int i=1;i<=k;i++)
        x[i]=aux[i];
}

int main()
{
    fin>>k>>s>>n;

    for(int i=1;i<=n;i++)
        for(int j=1;j<=k;j++)
            fin>>a[i][j];

    for(int i=0;i<=s;i++)
        dp[0][i]=1;

    for(int i=1;i<=k;i++)
        dp[i][0]=1;

    for(int i=1;i<=k;i++)
        for(int j=1;j<=s;j++)
        {
            dp[i][j]=dp[i-1][j]+dp[i][j-1];
            if(dp[i][j]>=Mod)dp[i][j]-=Mod;
        }

    sol=dp[k][s]-k*s-1;

    Back(1,1);

    fout<<sol<<"\n";
    return 0;
}