Cod sursa(job #892412)

Utilizator ChallengeMurtaza Alexandru Challenge Data 26 februarie 2013 08:54:18
Problema Cowfood Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <fstream>

using namespace std;

const char InFile[]="cowfood.in";
const char OutFile[]="cowfood.out";
const int MaxK=31;
const int MaxS=10001;
const int MaxN=21;
const int MOD=3210121;

ifstream fin(InFile);
ofstream fout(OutFile);

struct Joint
{
	int Iarba[MaxK];
};

int N,K,S,depth,sol,D[MaxK][MaxS];
int semn=1;
Joint X[MaxN];

void back(Joint Xp, bool use=false)
{
	if(use)
	{
		int Sp=S;
		for(register int i=1;i<=K;++i)
		{
			Sp-=Xp.Iarba[i];
		}
		if(Sp>=0)
		{
			sol+=semn*D[K+1][Sp+1];
			if(sol>=MOD)
			{
				sol-=MOD;
			}
			else if(sol<0)
			{
				sol+=MOD;
			}
		}
	}
	
	++depth;
	if(depth>N)
	{
		--depth;
		return;
	}
	back(Xp,false);
	for(register int i=1;i<=K;++i)
	{
		Xp.Iarba[i]=max(Xp.Iarba[i],X[depth].Iarba[i]);
	}
	semn*=-1;
	back(Xp,true);
	semn*=-1;
	
	--depth;
}

int main()
{
	fin>>K>>S>>N;
	for(register int i=1;i<=N;++i)
	{
		for(register int j=1;j<=K;++j)
		{
			fin>>X[i].Iarba[j];
		}
	}
	fin.close();
	
	for(register int j=1;j<=S;++j)
	{
		D[0][j]=1;
	}
	for(register int i=1;i<=K;++i)
	{
		for(register int j=0;j<=S;++j)
		{
			D[i][j]=D[i-1][j]+D[i][j-1];
			if(D[i][j]>=MOD)
			{
				D[i][j]-=MOD;
			}
		}
	}
	
	sol=(MOD+D[K][S]-S*K-1)%MOD;
	back(X[0]);
	
	fout<<sol;
	fout.close();
	return 0;
}