Cod sursa(job #2842804)

Utilizator chriss_b_001Cristian Benghe chriss_b_001 Data 1 februarie 2022 15:38:12
Problema Cowfood Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.25 kb
#include <fstream>

using namespace std;

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

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

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

void EuclidExtins(int a, int b, int &d, int &x, int &y)
{
    if(b == 0)
    {
        x = 1;
        y = 1;
        d = a;
    }
    else
    {
        int x0, y0;
        EuclidExtins(b, a % b, d, x0, y0);
        x = y0;
        y = x0 - (a / b) * y0;
    }
}

int inversMod(int a)
{
    int d, x, y;
    EuclidExtins(a, MOD, d, x, y);
    x %= MOD;
    if(x < 0)x += MOD;
    return x;
}


//int 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 calcSumComb()
{
    for(int i = 0; i <= S; i++)
        SCOMB[i] = 1;

    for(int i = 1; i <= K; i++)
        for(int j = 1; j <= S; j++)
        {
            SCOMB[j] += SCOMB[j - 1];
            SCOMB[j] %= MOD;
        }
}

void genSubm()
{
    int semn, k = 1, i;
    x[1] = 0;
    while(k > 0)
        if(x[k] < N)
        {
            x[k]++;
            int sum=0;
            for(i = 1; i <= K; i++)
            {
                MAX[k][i] = max(MAX[k - 1][i], M[x[k]][i]);
                sum += MAX[k][i];
            }

            if(sum <= S)
            {
                if(k % 2 != 0)
                {
                    E += SCOMB[S - sum];
                    E %= MOD;
                }
                else
                {
                    E -= SCOMB[S - sum];
                    if(E < 0)E += MOD;
                }
            }

            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];
    genSubm();
    V = SCOMB[S] - S * K - 1 - E;
    V %= MOD;
    g << V;
    return 0;
}