Cod sursa(job #1754459)

Utilizator calin9819Costea Calin calin9819 Data 8 septembrie 2016 12:05:47
Problema Cowfood Scor 16
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 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);
        sum += comb;
        sum %= MOD;
        }
    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];
                int t = MOD + semn * card(D, K, 0);
                E += t;
                E %= MOD;
                }
            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;
    V -= E;
    if(V < 0)V += MOD;
    g << V;
    return 0;
    }