Cod sursa(job #2305772)

Utilizator anca.sotirAnca Sotir anca.sotir Data 21 decembrie 2018 01:02:08
Problema Cowfood Scor 48
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.5 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;

void comb()
{
    combinari.resize(s+k+10);
    for(int i=0; i<combinari.size(); ++i)
    {
        combinari[i].resize(k+10,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 j=0; j<k; ++j)
            f>>esuate[i][j];
    }

    int ans=0;

    for(int sub=0; sub<(1<<n); ++sub)
    {
        int semn=1;
        vector <int> maxime(k,0);
        int suma_maxime=0;

        for(int i=0; i<n; ++i)
            if(sub&(1<<i))
            {
                semn*=-1;
                for(int j=0;j<k;++j)
                    if(esuate[i][j]>maxime[j])
                    {
                        suma_maxime+=(esuate[i][j]-maxime[j]);
                        maxime[j]=esuate[i][j];
                    }
            }

        int rest=s-suma_maxime;

        ans=(ans+semn*combinari[k+rest][k]+nprim)%nprim;

        //g<<sub<<' '<<ans<<'\n';

    }

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

    g<<ans;

    return 0;
}