Cod sursa(job #3283246)

Utilizator iulia_morariuIuli Morariu iulia_morariu Data 8 martie 2025 18:53:30
Problema Cowfood Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <iostream>
#include <fstream>
#include <vector>
//#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");

ll f[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 combinari(ll n, ll k){
    ll f1 = f[n];
    ll f2 = f[k] * f[n - k];

    return (f1 * exp_rpd(f2, MOD - 2)) % MOD;
}

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

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

    int k, s, n; 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]; 
    }

    int sp[s + 1];
    sp[0] = 1;
    for(int i = 1; i <= s; i++){
        sp[i] = combinari(i + k - 1, k - 1);
        // sp[i] -= k; // sa nu fie toate concentrate in 1
        // cout << "i = " << i << " pos = " << sp[i] << '\n';
        sp[i] = (sp[i - 1] + sp[i]) % MOD;
    }

    // cout << "sp[1] = " << sp[1] << '\n';
    ll tot = sp[s] - k * s - 1; // -1 pt sp[0]
    // cout << "tot = " << tot << '\n';
    for(int p = 1; p < (1 << n); p++){
        // we do the subset de p (cu biti)

        int smax = s;
        int mx[k];
        bool fr = 1;
        for(int i = 0; i < n; i++){ // pozitia
            if( (p & (1 << i)) == 0 ) continue;
            for(int x = 0; x < k; x++){
                if(fr) mx[x] = v[i][x];
                else mx[x] = max(mx[x], v[i][x]);
            }
            if(fr) fr = 0;
        }

        for(int i = 0; i < k; i++) smax -= mx[i];
        if(smax < 0) continue;
        // smax = max(smax, 0);

        tot -= sp[ smax ]; // +1 ca facem si 0
        // cout << "smax = " << smax << '\n';
        // cout << "mx : ";
        // for(int i = 0; i < k; i++) cout << mx[i] << " ";
        // cout << '\n';
    }

    out << tot << '\n';

    return 0;
}