Cod sursa(job #2305764)

Utilizator anca.sotirAnca Sotir anca.sotir Data 21 decembrie 2018 00:39:19
Problema Cowfood Scor 26
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <fstream>
#include <vector>

#define nprim 3210121

using namespace std;

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

int k,s,n;

vector<vector<int> > combinari;
vector<vector<int> > esuate;
vector <int> esuate_sel;
int ans;

void comb()
{
    combinari.resize(s+k);
    for(int i=0;i<combinari.size();++i)
    {
        combinari[i].resize(k+1,0);
        combinari[i][0]=1;
        if(i==0)
            continue;
        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 main()
{
    f>>k>>s>>n;
    comb();
    esuate.resize(n);
    for(int i=0;i<n;++i)
        esuate[i].resize(k);

    for(int i=0;i<n;++i)
        for(int j=0;j<k;++j)
            f>>esuate[i][j];

    int ans=0;

    for(int sub=0;sub<(1<<n);++sub)
    {
        if(!esuate_sel.empty())
            esuate_sel.clear();

        for(int i=0;i<n;++i)
            if(sub&(1<<i))
                esuate_sel.push_back(i);

        int semn;
        if(esuate_sel.size()%2)
            semn=-1;
        else semn=1;

        int suma_maxime=0;
        for(int i=0;i<n;++i)
        {
            int maxim=0;
            for(int j=0;j<esuate_sel.size();++j)
                if(esuate[esuate_sel[j]][i]>maxim)
                    maxim=esuate[esuate_sel[j]][i];
            suma_maxime+=maxim;
        }

        int rest=s-suma_maxime;

        int termen=0;
        for(int i=k-1;i<=k+rest-1;++i)
        {
            termen+=combinari[i][k-1]%nprim;
            termen%=nprim;
        }

        ans+=semn*termen;
        ans%=nprim;
    }

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

    g<<ans;

    return 0;
}