Cod sursa(job #3276808)

Utilizator bogdan1479Luca Bogdan Alexandru bogdan1479 Data 14 februarie 2025 19:25:11
Problema Cowfood Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <fstream>

using namespace std;

const int MOD = 3210121, NMAX = 21,
          KMAX = 31, SMAX = 10001;

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

int kk, s, n, v, e, m[NMAX][KMAX],
    x[NMAX], maxi[NMAX][KMAX], scomb[SMAX];

void genSComb()
{
    for(int i = 0; i <= s; ++i) scomb[i] = 1;
    for(int i = 1; i <= kk; ++i)
        for(int j = 1; j <= s; ++j) scomb[j] = (scomb[j] + scomb[j - 1]) % MOD;
}

void bt(int k)
{
    for(int i = x[k - 1] + 1; i <= n; ++i)
    {
        int sum = 0;
        for(int j = 1; j <= kk; ++j)
        {
            maxi[k][j] = max(maxi[k - 1][j], m[i][j]);
            sum += maxi[k][j];
        }
        if(sum <= s)
        {
            if(k & 1)
            {
                e += scomb[s - sum];
                if(e > MOD) e -= MOD;
            }
            else
            {
                e -= scomb[s - sum];
                if(e < 0) e += MOD;
            }
            x[k] = i, bt(k + 1);
        }
    }
}

int main()
{
    fin >> kk >> s >> n;
    for(int i = 1; i <= n; ++i)
        for(int j = 1; j <= kk; ++j) fin >> m[i][j];
    genSComb();
    bt(1);
    v = (scomb[s] - s * kk - 1 - e) % MOD;
    if(v < 0) v += MOD;
    fout << v;
    return 0;
}