Cod sursa(job #1757114)

Utilizator calin9819Costea Calin calin9819 Data 14 septembrie 2016 15:47:42
Problema Cowfood Scor 14
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 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], scomb[31][10001];

void suma_combinari()
{
    for (int i = 0; i <= S; i++)
        scomb[0][i] = 1;
    for (int i = 1; i <= K; i++) {
        scomb[i][0] = 1;
        for (int j = 1; j <= S; j++)
            scomb[i][j] = scomb[i - 1][j] + scomb[i][j - 1];
    }
    return;
}

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;
    int 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 * scomb[K][D];
                E %= MOD;
            }
            else
            {
                k++;
                x[k] = x[k - 1];
            }
        }
        else
            k--;
}

int main()
{
    f >> K >> S >> N;
    suma_combinari();
    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);
    V = scomb[K][S] - S * K - E - 1;
    V %= MOD;
    while (V < 0) V += MOD;
    g << V;
    return 0;
}