Cod sursa(job #1757068)

Utilizator Y.MalmsteenB.P.M. Y.Malmsteen Data 14 septembrie 2016 13:49:17
Problema Cowfood Scor 76
Compilator cpp Status done
Runda Lista lui wefgef Marime 1.6 kb
#include <iostream>
#include <fstream>
using namespace std;

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

const int NMAX = 21, KMAX = 31, SMAX = 10001;
const int MOD = 3210121;

int K, S, N, V, E;
int M[NMAX][KMAX], x[NMAX], MAX[NMAX][KMAX], SCOMB[KMAX][SMAX];

void calcSumComb()
{
    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]) % MOD;
        }
    }
}

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

int main()
{
    f >> K >> S >> N;
    calcSumComb();
    for(int i = 1; i <= N; i++)
        for(int j = 1; j <= K; j++)
            f >> M[i][j];
    E = 0;
    for(int i = 1; i <= N; i++)
        genSubm(N, i);
    V = SCOMB[K][S] + (MOD - S * K - 1);
    V %= MOD;
    V += MOD - E;
    V %= MOD;
    g << V;
    f.close();
    g.close();
    return 0;
}