Cod sursa(job #3326484)

Utilizator raulthestormIlie Raul Ionut raulthestorm Data 29 noiembrie 2025 10:02:58
Problema Cowfood Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <fstream>

using namespace std;
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];

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

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();
	//E = 0;
	bt(1);
	V = SCOMB[S] - S * K - 1 - E;
	V %= MOD;
	if(V < 0)V += MOD;
	g  << V;
	f.close();
	g.close();
	return 0;
}