Cod sursa(job #2305791)

Utilizator anca.sotirAnca Sotir anca.sotir Data 21 decembrie 2018 01:51:18
Problema Cowfood Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <fstream>
#include <vector>

#define nprim 3210121

using namespace std;

ifstream f("cowfood.in");
ofstream g("cowfood.out");

int k,s,n;
int combinari[10035][35],esuate[25][35];

void comb()
{
    combinari[0][0]=1;
    for(int i=1; i<=s+k; ++i)
    {
        combinari[i][0]=1;
        for(int j=1; j<=k && j<=i; ++j)
        {
            combinari[i][j]=combinari[i-1][j]+combinari[i-1][j-1];
            combinari[i][j]%=nprim;
        }
    }
}

int stiva[25];
int maxime[25][35];
int ans;
int semn=1;

void backtrack(int niv)
{
    if(niv==n+1)
    {
        int suma_maxime=0;
        for(int i=0;i<k;++i)
            suma_maxime+=maxime[n][i];

        int rest=s-suma_maxime;
        if(rest<0) return ;
        ans=(ans+semn*combinari[k+rest][k]+nprim)%nprim;

        return;
    }
    stiva[niv]=0;
    for(int i=0;i<k;++i)
    {
        maxime[niv][i]=maxime[niv-1][i];
    }
    backtrack(niv+1);
    stiva[niv]=1;
    semn*=-1;
    for(int i=0;i<k;++i)
    {
        maxime[niv][i]=max(maxime[niv-1][i],esuate[niv-1][i]);
    }
    backtrack(niv+1);
    semn*=-1;
}

int main()
{
    f>>k>>s>>n;
    comb();
    for(int i=0; i<n; ++i)
    {
        for(int j=0; j<k; ++j)
            f>>esuate[i][j];
    }

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

    backtrack(1);

    ans=(ans-(s*k+1)+nprim)%nprim;

    g<<ans;

    return 0;
}