Cod sursa(job #3202251)

Utilizator Maftei_TudorMaftei Tudor Maftei_Tudor Data 11 februarie 2024 11:13:35
Problema Cowfood Scor 14
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <iostream>

#define int long long

using namespace std;
const int N = 35, mod = 3210121;

int n, k, s, ans, maxi[N], fact[2*N], a[N][N];

int binpow(int baza, int exp) {
    if(!exp)
        return 1;

    long long p = binpow(baza, exp/2);
    if(exp & 1)
        return p * p % mod * baza % mod;
    else return p * p % mod;
}
int inv_mod(int a, int b) {
    return a * binpow(b, mod-2) % mod;
}
int comb(int n, int k) {
    return inv_mod(fact[n], fact[k] * fact[n-k] % mod);
}
int sb(int n, int k) {
    return comb(n+k-1, k-1);
}

int32_t main()
{
    freopen("cowfood.in", "r", stdin);
    freopen("cowfood.out", "w", stdout);

    fact[0] = 1;
    for(int i=1; i<2*N; i++)
        fact[i] = fact[i-1] * i % mod;

    cin >> k >> s >> n;
    for(int i=1; i<=n; i++)
        for(int j=1; j<=k; j++)
            cin >> a[i][j];

    for(int j=1; j<=(1<<n)-1; j++) {
        for(int i=1; i<=k; i++)
            maxi[i] = -1;

        for(int i=1; i<=n; i++)
            if(j & (1 << (i - 1))) {
                for(int l=1; l<=k; l++)
                    maxi[l] = max(maxi[l], a[i][l]);
            }

        int sum = 0;
        for(int i=1; i<=k; i++)
            sum = (sum + maxi[i]) % mod;

        if(__builtin_popcount(j) & 1) {
            if(sum < s)
                ans = (ans + sb(s-sum, k+1)) % mod;
            else if (sum <= s)
                ans = (ans + 1) % mod;
        }
        else {
            if(sum < s)
                ans = (ans - sb(s-sum, k+1) + mod);
            else if(sum <= s)
                ans = (ans - 1 + mod) % mod;
        }
    }

    cout << (sb(s-k, k+1) - ans + mod) % mod;
    return 0;
}