Cod sursa(job #182725)

Utilizator ErgoVicol Sergiu Constantin Ergo Data 21 aprilie 2008 11:27:20
Problema Lampa Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
//LAMPA INFOARENA
#include <fstream.h>

#define FMAX 18
#define MMAX 3100000

ifstream fin("lampa.in");
ofstream fout("lampa.out");

unsigned long long fib[20];
int n,m;
char A[MMAX];
void fibbonaci()
{
	int i;
	fib[1]=fib[2]=1;
	for (i=3;i<=FMAX;i++)
		fib[i]=fib[i-1]+fib[i-2];
}
int verificare(int a,int b,int s1,int p)
{
	int i;
	int ok=1;
	if (p==1)
		for (i=1;i<=a;i++)
			if (A[s1+i-1]!=A[i])
				ok=0;
	if (p==2)
		for (i=1;i<=b;i++)
			if (A[s1+i-1]!=A[a+i])
				ok=0;
	if (p>2)
	{
		ok=verificare(a,b,s1,p-2);
		int z;
		if (p-2==1) z=a;
		if (p-2==2) z=b;
		if (p-2>2) z=a*(fib[p-4])+b*(fib[p-3]);
		ok=ok&&verificare(a,b,s1+z,p-1);
	}
	return ok;
}
void solve()
{
	int i;
	fin>>n>>m;
	unsigned long long la=fib[n-2],lb=fib[n-1];

	for (i=1;i<=m;i++)
		fin>>A[i];
	for (i=1;i<=m;i++)
	{
		if ((m-la*i)%lb==0)
		{
			int a=i;
			int b=(m-la*i)/lb;
			int ok;
				ok=verificare(a,b,1,n);
			if (ok){
				int k;
				for (k=1;k<=a;k++)
					fout<<A[k];
				fout<<'\n';
				for (k=a+1;k<=a+b;k++)
					fout<<A[k];
				return;
			}
		}
	}
	fout<<'0';
}

int main()
{
	fibbonaci();
	solve();
	fout.close();
	return 0;
}