Cod sursa(job #182738)

Utilizator ErgoVicol Sergiu Constantin Ergo Data 21 aprilie 2008 11:48:24
Problema Lampa Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 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];
unsigned long long n,m;
char A[MMAX];
unsigned long long xa,xb;
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)
{
	unsigned long long i;
	int ok=1;
	if (p==1)
		for (i=1;i<=a;i++)
			if (A[s1+i-1]!=A[xa+i])
				ok=0;
	if (p==2)
		for (i=1;i<=b;i++)
			if (A[s1+i-1]!=A[xb+i])
				ok=0;
	if (p>2)
	{
		ok=verificare(a,b,s1,p-2);
		unsigned long long 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()
{
	unsigned long long 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)
		{
			unsigned long long a=i;
			unsigned long long b=(m-la*i)/lb;
			int ok;
			if (n%2==1) xa=0, xb=a;
			else xa=b, xb=0;
				ok=verificare(a,b,1,n);
			if (ok){
				unsigned long long k;
				for (k=xa+1;k<=xa+a;k++)
					fout<<A[k];
				fout<<'\n';
				for (k=xb+1;k<=xb+b;k++)
					fout<<A[k];
				return;
			}
		}
	}
	fout<<'0';
}

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