Cod sursa(job #388911)

Utilizator ProtomanAndrei Purice Protoman Data 31 ianuarie 2010 13:35:28
Problema Lampa Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <algorithm>
#include <stdio.h>
#include <vector>

#define MAX 3100000
#define pb push_back

using namespace std;

vector <int> vctP[32];
char strInit[MAX];
int n, m;
int l[4], st[4];
int ast[32], bur[32];

int main()
{
	freopen("lampa.in", "r", stdin);
	freopen("lampa.out", "w", stdout);

	scanf("%d %d\n", &n, &m);
	fgets(strInit + 1, MAX, stdin);

	ast[1] = bur[2] = 1;
	vctP[1].pb(1);
	vctP[2].pb(2);
	for (int i = 3; i <= n; i++)
	{
		ast[i] = ast[i - 1] + ast[i - 2];
		bur[i] = bur[i - 1] + bur[i - 2];

		vctP[i] = vctP[i - 2];
		for (int j = 0; j < vctP[i - 1].size(); j++)
			vctP[i].pb(vctP[i - 1][j]);
	}

	for (int i = 1; i * ast[n] <= m; i++)
		if ((m - ast[n] * i) % bur[n] == 0)
		{
			l[1] = i, l[2] = (m - ast[n] * i) / bur[n];
			if (n & 1)
				st[1] = 0, st[2] = l[1];
			else st[1] = l[2], st[2] = 0;

			int r = 0;
			int ok = 1;
			for (int ac = 0; ac < vctP[n].size() && ok; ac++)
			{
				for (int lung = 1; lung <= l[vctP[n][ac]]; lung++)
					if (strInit[r + lung] != strInit[st[vctP[n][ac]] + lung])
						ok = 0;

				r += l[vctP[n][ac]];
			}

			if (ok)
			{
				for (int i = 1; i <= l[1]; i++)
					printf("%c", strInit[st[1] + i]);
				printf("\n");
				for (int i = 1; i <= l[2]; i++)
					printf("%c", strInit[st[2] + i]);
				printf("\n");

				return 0;
			}
		}

	printf("0\n");
		
	fclose(stdin);
	fclose(stdout);
	return 0;
}