Cod sursa(job #3219247)

Utilizator Robert_MitriRobert Mitri Robert_Mitri Data 30 martie 2024 16:19:51
Problema Cowfood Scor 58
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("cowfood.in");
ofstream fout("cowfood.out");

const int mod = 3210121;

const int kmax = 30;
const int smax = 10000;

int n,k,s;
bool bk[kmax + 5];

int a[kmax + 5][kmax + 5];
int d[smax + 5][kmax + 5];
int sol;
vector <int> x;

void bt(int pas,int nrset = 0)
{
    if(pas==n)
    {
        if(nrset==0)
            return;
        int smx = 0;
        for(int j = 1;j<=k;j++)
        {
            int s=0;
            for(auto& i : x)
                    s=max(s,a[i][j]);
            smx+=s;
        }
        if(smx > s)
            return;
        if(nrset%2)
            sol =(sol - d[s-smx][k+1]+mod)%mod;
        else
            sol =(sol + d[s-smx][k+1])%mod;
        return;
    }
    bt(pas+1,nrset);
    bk[pas+1]=1;
    x.push_back(pas+1);
    bt(pas+1,nrset+1);
    bk[pas+1]=0;
    x.pop_back();
}



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 j = 0;j<=k+1;j++)
        d[0][j]=1;
    for(int i = 1;i<=s+1;i++)
        for(int j = 0;j<=k+1;j++)
            if(j<=1)
                d[i][j] = 1;
            else
                d[i][j]=(d[i-1][j]+d[i][j-1])%mod;

    sol =(sol+ d[s][k+1] - s*k -1 + mod)%mod;
    x.resize(n+1);
    bt(0);
    fout<<sol;
}