Cod sursa(job #2845137)

Utilizator levladiatorDragutoiu Vlad-Ioan levladiator Data 7 februarie 2022 15:59:08
Problema Cowfood Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <iostream>
#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 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 k = 1;
    x[1] = 0;

    while ( k > 0 )
    {
        if ( x[k] < N )
        {
            x[k]++;
            int sum = 0;

            for ( int 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];

    E = 0;
    genSubm();
    V = SCOMB[S] + ( MOD - S * K - 1 );
    V %= MOD;
    V += MOD - E;
    V %= MOD;
    g << V;
    f.close();
    g.close();
    return 0;
}