Cod sursa(job #3136655)

Utilizator Ilie_MityIlie Dumitru Ilie_Mity Data 7 iunie 2023 14:41:57
Problema Cowfood Scor 44
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.53 kb
//Ilie Dumitru
#include<cstdio>
#include<algorithm>
const int NMAX=21;
const int KMAX=31;
const long long int MOD=3210121;

struct food
{
	int v[KMAX];

	food operator*(food b)
	{
		int i;
		food a;

		for(i=0;i<KMAX;++i)
			a.v[i]=std::max(v[i], b.v[i]);
		return a;
	}
};

long long int invFact[NMAX];

long long int fastExp(long long int x, long long int y)
{
	if(y==0)
		return 1;
	if(y==1)
		return x;
	long long int a=fastExp(x, y>>1);
	a=a*a%MOD;
	if(y&1)
		a=a*x%MOD;
	return a;
}

void precalc()
{
	int i, f=1;

	invFact[0]=1;
	for(i=1;i<NMAX;++i)
		invFact[i]=fastExp(f=f*i%MOD, MOD-2);
}

long long int getCnt(int N, int S)
{
	long long int ans=1;
	int i;

	for(i=1;i<=N;++i)
		ans=ans*(S+i)%MOD;
	return ans*invFact[N]%MOD;
}

int N, K, S;
int ans=0;
food v[NMAX];

void back(int k, food& f, bool added=1)
{
	if(k==N)
	{
		int i, s=S;

		for(i=0;i<K;++i)
			s-=f.v[i];

		if(s>-1)
		{
			if(added)
				ans=(ans+getCnt(K, s))%MOD;
			else
				ans=(ans-getCnt(K, s)+MOD)%MOD;
		}
	}
	else
	{
		food prop=v[k]*f;
		back(k+1, f, added);
		back(k+1, prop, !added);
	}
}

int main()
{
	FILE* f=fopen("cowfood.in", "r"), *g=fopen("cowfood.out", "w");
	//FILE* f=stdin, *g=stdout;
	int i, j;
	food aux;

	precalc();

	fscanf(f, "%d%d%d", &K, &S, &N);
	for(i=0;i<K;++i)
		aux.v[i]=0;
	for(i=0;i<N;++i)
		for(j=0;j<K;++j)
			fscanf(f, "%d", v[i].v+j);

	back(0, aux);

	fprintf(g, "%d\n", (int)((ans-K*S-1+MOD)%MOD));

	fclose(f);
	fclose(g);
	return 0;
}