Cod sursa(job #3289384)

Utilizator alexvali23alexandru alexvali23 Data 26 martie 2025 18:04:45
Problema Cowfood Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <fstream>
using namespace std;

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

int K, S, N, V, E;
int M[NMAX][KMAX], x[NMAX], MAX[NMAX][KMAX], SCOMB[SMAX];

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

void calcSumComb() {
    for (int i = 0; i <= S; ++i) {
        SCOMB[i] = 1;
    }
    for (int i = 1; i <= K; ++i) {
        for (int j = 1; j <= S; ++j) {
            SCOMB[j] += SCOMB[j - 1];
            SCOMB[j] %= MOD;
        }
    }
}

void bt(int k) {
    for (int i = x[k - 1] + 1; i <= N; ++i) {
        int sum = 0;
        for (int j = 1; j <= K; ++j) {
            MAX[k][j] = max(MAX[k - 1][j], M[i][j]);
            sum += MAX[k][j];
        }
        if (sum <= S) {
            if (k % 2 != 0) {
                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() {
    f >> K >> S >> N;
    for (int i = 1; i <= N; ++i) {
        for (int j = 1; j <= K; ++j) {
            f >> M[i][j];
        }
    }

    calcSumComb();
    bt(1);

    V = SCOMB[S] - S * K - 1 - E;
    V %= MOD;
    if (V < 0) V += MOD;

    g << V;

    f.close();
    g.close();

    return 0;
}