Cod sursa(job #1304744)

Utilizator assa98Andrei Stanciu assa98 Data 29 decembrie 2014 11:24:14
Problema Cowfood Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <fstream>
#include <algorithm>
using namespace std;

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

const int MAX_N = 22;
const int MAX_K = 32;
const int MAX_S = 10100;

const long long MOD = 3210121;

long long d[MAX_S];
int v[MAX_N][MAX_K];
int ans;
int p[MAX_N][MAX_K];
int n, k, s;

long long put(long long a, int b) {
    if(b == 0) {
        return 1;
    }
    if(b & 1) {
        return ((long long)a * put(a, b - 1)) % MOD;
    }

    long long x = put(a, b / 2);
    return (x * x) % MOD;
}

void subm(int l, bool par) {
    if(l == n) {
        int sum = 0;
        for(int i = 1; i <= k; i++) {
            sum += p[l][i];
        }

        if(sum <= s) {
            if(par) {
                ans = (ans + d[s - sum]) % MOD;
            }
            else {
                ans = (ans - d[s - sum] + MOD) % MOD;
            }
        }

        return;
    }

    for(int i = 1; i <= k; i++) {
        p[l + 1][i] = p[l][i];
    }
    subm(l + 1, par);

    for(int i = 1; i <= k; i++) {
        p[l + 1][i] = max(p[l + 1][i], v[l + 1][i]);
    }
    subm(l + 1, par ^ true);
}

int main() {
    fin >> k >> s >> n;

    d[0] = 1;
    for(int i = 1; i <= s; i++) {
        d[i] = ((long long)((d[i - 1] * (i + k - 1)) % MOD) * put(i, MOD - 2)) % MOD;
    }
    for(int i = 1; i <= s; i++) {
        d[i] = (d[i] + d[i - 1]) % MOD;
    }

    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= k; j++) {
            fin >> v[i][j];
        }
    }

    subm(0, true);

    ans = (ans - k * s - 1 + MOD) % MOD;
    fout << ans;
    return 0;
}