Cod sursa(job #3299900)

Utilizator Mihai_OctMihai Octavian Mihai_Oct Data 11 iunie 2025 17:39:42
Problema Cowfood Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.72 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 fact[MAX + 2];
long long k, s, n, i, j;
long long a[102][102];
long long v[102];

long long rasp;

static inline long long Put(long long a, long long n = MOD - 2) {
    long long p = 1;
    while(n) {
        if(n & 1) p = (p * a) % MOD;
        a = (a * a) % MOD;
        n >>= 1;
    }
    return p;
}

static inline void PrecalcFact() {
    fact[0] = 1;
    for(i = 1; i <= s; i++) fact[i] = (fact[i - 1] * i) % MOD;
}

static inline long long Comb(long long n, long long k) {
    return fact[n] * Put(fact[k] * fact[n - k] % MOD) % 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 = Comb(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;
    PrecalcFact();
    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;
}