Cod sursa(job #137380)

Utilizator tvladTataranu Vlad tvlad Data 17 februarie 2008 11:51:14
Problema Lampa Scor 20
Compilator cpp Status done
Runda preONI 2008, Runda 4, Clasa a 9-a Marime 1.43 kb
#include <cstdio>
#include <string>
using namespace std;

const int N = 1000000;

int s,n,a,b;
char c[N];
char c1[10000], c2[10000];

string fib ( int s, int &a, int &b ) {
	int v[3][2] = {{0,0}, {1,0}, {0,1}};
	string ss[3] = {"", "1", "2"};
	for (int i = 3; i <= s; ++i) {
		v[i%3][0] = v[(i-2)%3][0] + v[(i-1)%3][0];
		v[i%3][1] = v[(i-2)%3][1] + v[(i-1)%3][1];
		ss[i%3] = ss[(i-2)%3] + ss[(i-1)%3];
	}
	a = v[s%3][0]; b = v[s%3][1];
	return ss[s%3];
}

int main() {
	freopen("lampa.in","rt",stdin);
	freopen("lampa.out","wt",stdout);
	scanf("%d %d",&s,&n);
	if (n > N) {
		printf("0\n");
		return 0;
	}
	scanf("%s",c);
	string ss = fib(s,a,b);
	for (int x = 1; x < 2000; ++x) {
		if ((n-x*a)%b == 0 && (n-x*a)/b > 0) {
			int y = (n-x*a) / b;
			bool wrong = false;
			for (int i = 0; i < x; ++i) c1[i] = c[i];
			c1[x] = '\0';
			for (int i = 0; i < y; ++i) c2[i] = c[x+i];
			c2[y] = '\0';
			for (int i = 0, k = 0, lim = 0; i < ss.size() && !wrong; ++i) {
				if (ss[i] == '1') {
					lim += x;
					for (int start = k; k < lim; ++k) {
						if (c[k] != c1[k-start]) {
							wrong = true;
							break;
						}
					}
				} else {
					lim += y;
					for (int start = k; k < lim; ++k) {
						if (c[k] != c2[k-start]) {
							wrong = true;
							break;
						}
					}
				}
			}
			if (!wrong) {
				printf("%s\n%s\n",c1,c2);
				return 0;
			}
		}
	}
	printf("0\n");
	return 0;
}