Cod sursa(job #3289383)

Utilizator MilitaruMihai2022Millitaru Mihai MilitaruMihai2022 Data 26 martie 2025 18:02:51
Problema Cowfood Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <fstream>

using namespace std;

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

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

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 bt(int k)
{
    for(int i = x[k - 1] + 1; i <= N; ++i)
    {
        int sum = 0;
        for(int j = 1; j <= K; ++j)
        {
            MAX[k][j] = max(MAX[k - 1][j], M[i][j]);
            sum += MAX[k][j];
        }
        if(sum <= S)
        {
            if(k%2!=0)
            {
                E += SCOMB[S - sum];
                if(E >=MOD) E -= MOD;
            }
            else
            {
                E -= SCOMB[S - sum];
                if(E < 0) E += MOD;
            }
            x[k] = i, bt(k + 1);
        }
    }
}

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