Cod sursa(job #157563)

Utilizator mircea_infoSuciu Mircea-Gabriel mircea_info Data 13 martie 2008 09:29:18
Problema Lampa Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <stdio.h>
#include <string.h>

int n,m,fib[19],x[3],ok=0;
char s[3027198];

void genfib(int n){
	int i;
	fib[0]=1;
	fib[1]=1;
	for(i=2;i<=n;i++)
		fib[i]=fib[i-1]+fib[i-2];
}

void verifica(char a[],char b[]){
	int i;
	char aux1[100],aux2[100],aux[100];
	strcpy(aux1,a);
	strcpy(aux2,b);
	for(i=3;i<=n;i++){
		strcpy(aux,strcat(aux1,aux2));
		strcpy(aux1,aux2);
		strcpy(aux2,aux);
	}
	if(strcmp(aux,s)==0){
		printf("%s\n%s",a,b);
		ok=1;
	}
}

void formsol(){
	char a[100],b[100],k1=0,k2=0;
	int i,j;
	if(n%2!=0){
		for(i=0;i<x[1];i++)
			a[k1++]=s[i];
		a[k1]=0;
		for(j=i;j<i+x[2];j++)
			b[k2++]=s[j];
		b[k2]=0;
	}
	else{
		for(i=0;i<x[2];i++)
			b[k2++]=s[i];
		b[k2]=0;
		for(j=i;j<i+x[1];j++)
			a[k1++]=s[j];
		a[k1]=0;
	}
	verifica(a,b);
}

void solec(int k){
	int i;
	for(i=1;i<=(m-x[k-1]*fib[n-k-1])/fib[n-4+k];i++){
		x[k]=i;
		if(k==2){
			if(x[1]*fib[n-3]+x[2]*fib[n-2]==m)
				formsol();
		}
		else
			solec(k+1);
	}
}


int main(){
	freopen("lampa.in","r",stdin);
	freopen("lampa.out","w",stdout);
	scanf("%d%d\n",&n,&m);
	gets(s);
	genfib(n);
        x[0]=1;
	solec(1);
	if(ok==0)
		printf("0\n");
	fclose(stdout);
	return 0;
}