Cod sursa(job #3292602)

Utilizator Allie28Radu Alesia Allie28 Data 8 aprilie 2025 18:24:04
Problema Cowfood Scor 18
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.86 kb
#include <bits/stdc++.h>

#define ll long long

using namespace std;

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

const int LMAX = 10;
const int INF = 0x3f3f3f3f;
const ll MOD = 3210121;

ll v[LMAX*2 + 5][LMAX*3 + 5], dp[10005], aux[LMAX*3 + 5];

//|Ai| --> nr de submultimi care nu mai pot fi generate
//dp[i] --> nr de a face sume din k termeni, mai mici sau egale cu i

int main() {
    ll n, s, k, i, j;
    fin>>k>>s>>n;
    for (i = 0; i < n; i++) {
        for (j = 0; j < k; j++) {
            fin>>v[i][j];
        }
    }
    if (k > s) {
        fout<<0;
        return 0;
    }
    //i stars, k - 1 bars
    //comb din i + k - 1 luate cate k - 1
    ll u, d;
    dp[0] = 1;
    u = k;
    d = 1;
    for (i = 1; i <= s; i++) {
        dp[i] = (dp[i - 1]*u/d)%MOD;
        u++;
        d++;
//        fout<<dp[i]<<" ";
    }
    //sume partiale
    for (i = 1; i <= s; i++) {
        dp[i] = (dp[i - 1] + dp[i])%MOD;
    }
    ll ans = 0;
    ll sign, sum;
    for (int mask = 1; mask < (1<<n); mask++) {
        sign = 0;
        for (i = 0; (1<<i) <= mask; i++) {
            if (mask&(1<<i)) {
                for (j = 0; j < k; j++) {
                    aux[j] = max(aux[j], v[i][j]);
                }
                sign = 1 - sign;
            }
        }
        sum = 0;
        for (j = 0; j < k; j++) {
            sum += aux[j];
            aux[j] = 0;
        }
//        fout<<sum<<endl;
        if (sum > s) continue;
//        fout<<dp[s - sum]<<endl;
        if (sign) {
            ans = (ans + dp[s - sum])%MOD;
        }
        else {
            ans = (ans - dp[s - sum])%MOD;
        }
    }
//    fout<<ans<<endl;
    ll ans2 = dp[s - k] - ans;
    while (ans2 < 0) {
        ans2 += MOD;
    }
    fout<<ans2;


    fin.close();
    fout.close();
    return 0;
}