Cod sursa(job #2297364)

Utilizator sandupetrascoPetrasco Sandu sandupetrasco Data 5 decembrie 2018 19:09:28
Problema Cowfood Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.38 kb
#pragma GCC optimize("-O3")
#include <bits/stdc++.h>

using namespace std;

const int MOD = 3210121;

int n, s, k, C[10045][35], a[25][35], sum, cnt, mx[35], prevMax[25][35], rs;
bool viz[25];

void back(int curr, int cnt) {
    if (curr == n + 1) {
        int sum = 0;
        for (int i = 1; i <= k; i++) {
            sum += mx[i];
        }

        if (sum > s) return ;

        int mult = (cnt % 2 == 0) - (cnt % 2 == 1);
        
        rs += mult * C[s - sum][k];
        rs %= MOD;
    } else {
        back(curr + 1, cnt);

        for (int i = 1; i <= k; i++) {
            prevMax[curr][i] = mx[i];
            mx[i] = max(mx[i], a[curr][i]);
        }

        back(curr + 1, cnt + 1);

        for (int i = 1; i <= k; i++) {
            mx[i] = prevMax[curr][i];
        }
    }
}

int main() {
    FILE* fi = fopen("cowfood.in", "r");
    FILE* fo = fopen("cowfood.out", "w");

    fscanf(fi, "%d%d%d", &k, &s, &n);
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= k; j++) {
            fscanf(fi, "%d", &a[i][j]);
        }
    }

    for (int j = 1; j <= s; j++) C[j][0] = 1;

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

    back(1, 0);

    rs = rs - k * s - 1;
    while (rs < 0) rs += MOD;
    rs %= MOD;

    fprintf(fo, "%d", rs);
    return 0;
}