Cod sursa(job #3299903)

Utilizator Mihai_OctMihai Octavian Mihai_Oct Data 11 iunie 2025 17:48:24
Problema Cowfood Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <bits/stdc++.h>

using namespace std;

#define STDIO 0
#if STDIO
    #define fin cin
    #define fout cout
#else
    ifstream fin("cowfood.in");
    ofstream fout("cowfood.out");
#endif  // STDIO

const long long MOD = 3210121;
const long long MAX = 10000;
long long cmb[32][MAX + 2];
long long k, s, n, i, j;
long long a[102][102];
long long v[102];

long long rasp;

static inline void Precalc() {
    for(i = 0; i <= s; i++) cmb[0][i] = 1;
    for(i = 1; i <= k; i++) {
        cmb[i][0] = 1;
        for(j = 1; j <= s; j++) {
            cmb[i][j] = (cmb[i - 1][j] + cmb[i][j - 1]) % MOD;
        }
    }
}

static inline void Recur(long long poz = 1, long long sel = 0) {
    if(poz == n + 1) {
        long long sum = 0, com;
        for(long long i = 1; i <= k; i++) sum += v[i];

        if(sum > s) return;

        com = cmb[k][s - sum];
        if(sel % 2 == 1) com = -com;

        rasp = (rasp + com + MOD) % MOD;
    }
    else {
        Recur(poz + 1, sel);

        vector<long long> cop(k + 1);
        for(long long i = 1; i <= k; i++) {
            cop[i] = v[i];
            v[i] = max(v[i], a[poz][i]);
        }
        Recur(poz + 1, sel + 1);
        for(long long i = 1; i <= k; i++) v[i] = cop[i];
    }
}

int main() {
    fin >> k >> s >> n;
    Precalc();
    for(i = 1; i <= n; i++) {
        for(j = 1; j <= k; j++) {
            fin >> a[i][j];
        }
    }

    Recur();
    fout << (rasp - 1 - s * k + MOD) % MOD;

    return 0;
}