Cod sursa(job #3295255)

Utilizator iulia_morariuIuli Morariu iulia_morariu Data 3 mai 2025 19:52:25
Problema Cowfood Scor 18
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.4 kb
#include <algorithm>
#include <iostream>
#include <fstream>
#include <climits>
#include <vector>
#include <stack>
#include <cmath>
// #include <bits/stdc++.h>
#define in  fin
#define out fout

using namespace std;
using ll = long long;
const ll MOD = 3210121;

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

int f[10001], inv[10001];

ll exp_rpd(ll b, ll e){
    ll p = 1;
    while(e){
        if(e % 2) p = (p * b) % MOD;
        b = (b * b) % MOD;
        e /= 2;
    }
    return p;
}

ll C(ll n, ll k){
    return f[n] * exp_rpd(f[k] * f[n - k] % MOD, MOD - 2) % MOD;
}

signed main(){
    ios_base::sync_with_stdio(false);
    in.tie(NULL);

    f[0] = 1;
    for(int i = 1; i <= 10000; i++) f[i] = f[i - 1] * i % MOD;

    // inv[10000] = exp_rpd(f[10000], MOD - 2);
    // for(int i = 9999; i >= 0; i--) inv[i] = (inv[i + 1] * (i + 1)) % MOD;

    int n, k, s; in >> k >> s >> n;
    int v[n][k];

    for(int i = 0; i < n; i++){
        for(int j = 0; j < k; j++) in >> v[i][j];
    }

    ll spp[s + 1]; // osa fie gen spp[i] = C(0 + k - 1, k - 1) + ... + C(i + k - 1, k - 1)
    ll tot = 0;
    spp[0] = 1;
    for(int i = 1; i <= s; i++){
        spp[i] = (spp[i - 1] + C(i + k - 1, k - 1)) % MOD;
        // cout << "i = " << i << " C( " << i + k - 1 << " , " << k - 1 << " ) = " << C(i + k - 1, k - 1) << '\n';
    }

    for(int i = 1; i <= s; i++){
        tot = (tot + C(i + k - 1, k - 1) - k) % MOD;
    }

    // cout << "tot = " << tot << '\n';

    for(int p = 1; p < (1 << n); p++){
        int maxi[k];
        int cnt = 0;
        for(int i = 0; i < n; i++){
            if( (p & (1 << i)) == 0 ) continue; // nu incl sirul asta
            cnt++;
            for(int j = 0; j < k; j++){
                if(cnt == 1) maxi[j] = v[i][j];
                else maxi[j] = max(maxi[j], v[i][j]);
            }
        }

        int extra = s;
        for(int j = 0; j < k; j++) extra -= maxi[j];

        // cout << "p = " << p << " extra = " << extra << '\n';

        if(extra <= 0) continue;

        ll sum = spp[extra];
        // for(int j = 0; j <= extra; j++){
        //     sum = (sum + C(j + k - 1, k - 1)) % MOD;
        // }

        // cout << "p = " << p << '\n';
        // cout << "sum = " << sum << '\n';
        // cout << "spp[extra] = " << spp[extra] << '\n';

        if(cnt % 2 == 1) tot -= sum;
        else tot = (tot + sum) % MOD;
        tot = (tot + MOD) % MOD;
    }

    out << tot;

    return 0;
}