Cod sursa(job #1956862)

Utilizator GinguIonutGinguIonut GinguIonut Data 7 aprilie 2017 09:15:47
Problema Cowfood Scor 26
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <fstream>
#include <vector>
#include <string.h>
#include <algorithm>

#define kMax 31
#define sMax 10001
#define MOD 3210121

using namespace std;

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

int n, S, nrRestr, v[kMax], aux[kMax], restr[kMax][kMax];
long long dp[kMax][sMax], Sol;

void back(int poz, long long nr)
{
    if(poz==nrRestr+1)
    {
        if(v[1]!=0)
        {
            long long Sum=0;
            for(int i=1; i<=n; i++)
                Sum+=v[i];
            if(Sum<=S)
                Sol+=nr*dp[n][S-Sum];
        }
        return;
    }
    back(poz+1, nr);
    for(int i=1; i<=n; i++)
    {
        aux[i]=v[i];
        v[i]=max(v[i], restr[poz][i]);
    }
    back(poz+1, -nr);
    for(int i=1; i<=n; i++)
        v[i]=aux[i];
}

int main()
{
    fin>>n>>S>>nrRestr;
    for(int i=1; i<=nrRestr; i++)
        for(int j=1; j<=n; j++)
            fin>>restr[i][j];
    for(int i=0; i<=S; i++)
        dp[0][i]=1;
    for(int i=1; i<=n; i++)
        dp[i][0]=1;
    for(int i=1; i<=n; 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;
        }
    }

    back(1, -1);
    fout<<((1ll*(dp[n][S]-1-n*S-Sol))%MOD+MOD)%MOD;
}