Cod sursa(job #1754162)

Utilizator calin9819Costea Calin calin9819 Data 7 septembrie 2016 16:55:57
Problema Cowfood Scor 12
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <iostream>
#include <fstream>
using namespace std;

ifstream f("cowfood.in");
ofstream g("cowfood.out");

const int MOD = 3210121;

int K, S, N, V, E;
int M[21][31], x[21], MAX[21][31], si[21];

int card(int S, int K, int q) {
    int sum = 0;
    for (int i = q; i <= S; i++) {
        int comb = 1;
        for (int j = 1; j < K; j++)
            comb = (comb * (i + j) / j) % MOD;
        sum += comb;
    }
    return sum;
}

void maxv(int A[], int B[], int C[]) {
    for (int i = 1; i <= K; i++)
        C[i] = max(A[i], B[i]);
}

void gen_comb(int n, int m) {
    int k = 1;
    x[1] = 0;
    long long semn;
    if (m % 2 != 0) semn = 1;
    else semn = -1;
    while(k > 0)
        if(x[k] < n - m + k) {
            x[k]++;
            maxv(MAX[k - 1], M[k], MAX[k]);
            if(k == m) {
                    int D = S;
                    for (int i = 1; i <= K; i++)
                        D -= MAX[m][i];
                    E += semn * card(D, K, 0);
                }
            else {
                k++;
                x[k] = x[k - 1];
                }
            }
        else
            k--;
    }

int main()
{
    f >> K >> S >> N;
    V = card(S, K, 2) - (S - 1) * K;
    for (int i = 1; i <= N; i++)
        for (int j = 1; j <= K; j++)
            f >> M[i][j];

    for (int i = 1; i <= N; i++)
        gen_comb(N, i);

    cout << V << ' ' << E;
    g << V - E;
    return 0;
}