Cod sursa(job #2297291)

Utilizator sandupetrascoPetrasco Sandu sandupetrasco Data 5 decembrie 2018 18:02:26
Problema Cowfood Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <bits/stdc++.h>

using namespace std;

const int MOD = 3210121;

int n, s, k, C[10045][35], a[25][35];
long long rs;

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    ifstream cin("cowfood.in");
    ofstream cout("cowfood.out");

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

    C[0][0] = C[1][0] = C[1][1] = 1;
    for (int i = 0; i <= k; i++) {
        for (int j = 1; j <= s + k; j++) {
            C[j][i] = (C[j - 1][i - 1] + C[j - 1][i]) % MOD;
        }
    }

    int L = 1 << n;
    for (int i = 1; i < L; i++) {
        vector < int > V(k + 1, 0);
        int sum = 0, cnt = 0;

        for (int j = 1; j <= n; j++) {
            if (i & (1 << (j - 1))) {
                cnt++;

                for (int z = 1; z <= k; z++) {
                    V[z] = max(V[z], a[j][z]);
                }
            }
        }

        for (auto it : V) sum += it;

        if (sum > s) continue;

        int mult = (cnt % 2 == 1) - (cnt % 2 == 0);
        int rez = 0;
        for (int i = 0; i <= s - sum; i++) {
            rez = C[i + k - 1][i - 1];
            rs += (1LL * mult * rez) % MOD;
        }
    }

    rs = C[s + k - 1][k - 1] - rs;
    while (rs < 0) rs += MOD;
    rs %= MOD;

    cout << rs;
    return 0;
}