Cod sursa(job #806887)

Utilizator scipianusFMI Ciprian Olariu scipianus Data 3 noiembrie 2012 18:01:49
Problema Bowling Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
// Jocul Kayles - http://en.wikipedia.org/wiki/Kayles

#include<fstream>
using namespace std;
int T,n,mex[85];
bool viz[100];

inline void PrecalculareMex()
{
	int i,j;
	mex[0]=0;
	for(i=1;i<=83;i++) // numerele mex pentru Kayles sunt periodice dupa 72 cu perioada 12
	{
		// formez multimea
		for(j=0;j<i;j++)
		{
			viz[mex[j]^mex[i-j-1]]=true; // iau o popica
			if(j<i-1)
				viz[mex[j]^mex[i-j-2]]=true; // iau doua popici
		}
		// stabilesc mex pentru multime
		j=0;
		while(viz[j])
			j++;
		mex[i]=j;
		// sterg multimea
		j=0;
		while(j<100)
			viz[j++]=false;
	}
}

inline int Perioada(int x)
{
	if(x<72)
		return x;
	return 72+(x-72)%12;
}

int main()
{
	int i,lg1,rez,x;
	PrecalculareMex();
	ifstream fin("bowling.in");
	ofstream fout("bowling.out");
	fin>>T;
	while(T--)
	{
		fin>>n;
		lg1=0;
		rez=0;
		for(i=1;i<=n;i++)
		{
			fin>>x;
			if(x==0)
			{
				lg1=Perioada(lg1);
				rez=(rez^mex[lg1]);
				lg1=0;
			}
			else
				lg1++;
		}
		if(lg1)
		{
			lg1=Perioada(lg1);
			rez=(rez^mex[lg1]);
		}
		if(rez==0)
			fout<<"Fumeanu\n";
		else
			fout<<"Nargy\n";
	}
	fin.close();
	fout.close();
	return 0;
}