Cod sursa(job #1304719)

Utilizator assa98Andrei Stanciu assa98 Data 29 decembrie 2014 10:24:17
Problema Cowfood Scor 28
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 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 int MOD = 3210121;

int d[MAX_S];
int v[MAX_N][MAX_K];

int put(int 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;
}

int main() {
    int k, s, n;
    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 = 0; i < n; i++) {
        for(int j = 1; j <= k; j++) {
            fin >> v[i][j];
        }
    }
   
    int ans = (d[s] - k * s - 1) % MOD;
    if(ans < 0) {
        ans += MOD;
    }
    
    for(int i = 1; i < (1 << n); i++) {
        int sum = 0;
        bool par = false;
        for(int b = 0; b < n; b++) {
            if(i & (1 << b)) {
                par = par ^ true;
            }
        }

        for(int j = 1; j <= k; j++) {
            int val = 0;
            for(int b = 0; b < n; b++) {
                if(i & (1 << b)) {
                    val = max(val, v[b][j]);
                }
            }
            sum += val;
        }

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

    fout << ans;

    return 0;
}