Cod sursa(job #307218)

Utilizator CezarMocanCezar Mocan CezarMocan Data 23 aprilie 2009 18:07:43
Problema Lampa Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <cstdio>
#include <iostream>

using namespace std;

int n, m, i, j, k, sz, l1, l2, isol1, isol2;
string s, sol1, sol2, p1, p2, p3;
int fib[40];
int ok;

int main() {
	freopen("lampa.in", "r", stdin);
	freopen("lampa.out", "w", stdout);
	
	scanf("%d %d ", &n, &m);
	cin>>s;
	sz = s.size() - 1;

	fib[1] = fib[2] = 1;
	for (i = 3; i < 40; i++)
		fib[i] = fib[i - 1] + fib[i - 2];

	for (i = 1; i <= m; i++)
		sol1 += 'z';

//	printf("%d\n", fib[30]);

	for (i = 1; i * fib[n - 2] <= m; i++) {
//		l1 = i;
		if ((m - fib[n - 2] * i) % fib[n - 1] == 0) {
			l1 = i;
			l2 = (m - fib[n - 2] * l1) / fib[n - 1];
			if (isol1 == 0)
				isol1 = i;
			else
				if (isol2 == 0)
					isol2 = i;
			if (l2 == 0)
				continue;
//			printf("%d %d\n", l1, l2);
		
//			c1.clear();
//			c2.clear();
			string c1, c2;
			
			for (j = 0; j < l1; j++)
				c1 += s[j];
			for (j = l1; j < l1 + l2; j++)
				c2 += s[j];

			if (n % 2 == 0) {
				string aux = c1;
				c1 = c2;
				c2 = aux;
			}

			p1 = c1; p2 = c2;
			for (j = 3; j <= n; j++) {
				p3 = p1 + p2;
				p1 = p2;
				p2 = p3;
			}

			if (p3 == s) {
				ok = 1;
				if (c1 < sol1) {
					sol1 = c1;
					sol2 = c2;
					break;
				}
			}
/*			if (isol1 * isol2 != 0)
				i += isol2 - isol1 - 1;*/
		}
	}
	
	if (ok)
		cout<<sol1<<"\n"<<sol2<<"\n";
	else
		printf("0\n");

	return 0;
}