Pagini recente » Profil TeodorescuStefanEduard | Cod sursa (job #574676) | Cod sursa (job #384429) | Profil EdyIordache | Cod sursa (job #1565249)
#include <bits/stdc++.h>
#define maxL 75030
#define maxl 3027199
#define maxN 27
using namespace std;
int a, b, n, l, fib[maxN], nrsol;
char s[maxl];
char w[2][maxL], t[maxL];
void conc(int n)
{
int i;
w[0][0] = '0';
w[1][0] = '1';
for (i = 2; i < n; ++ i)
{
strcpy(t, w[i & 1]);
strcat(t, w[(i - 1) & 1]);
strcpy(w[i & 1], t);
memset(t, 0, sizeof(t));
}
}
int eq(int p, int l, int q)
{
int i;
for (i = 0; i < l; ++ i)
if (s[i + p] != s[i + q])
return 0;
return 1;
}
int ok(int x, int y)
{
int i, p = 0, a = 0, b = x, k = (n - 1) & 1;
if (n % 2 == 0)
{
b = 0;
a = y;
}
p = x + y;
for (i = 2; i < fib[n + 1]; ++ i)
{
if (w[k][i] == '0' && !eq(p, x, a))
return 0;
if (w[k][i] == '1' && !eq(p, y, b))
return 0;
if (w[k][i] == '0')
p += x;
else
p += y;
}
return 1;
}
void read()
{
freopen("lampa.in", "r", stdin);
scanf("%d %d\n", &n, &l);
gets(s);
}
void solve()
{
int i, x, y;
fib[2] = 1;
for (i = 3; i <= n + 1; ++ i)
fib[i] = fib[i - 1] + fib[i - 2];
conc(n);
if (n % 2)
{
for (x = 1; x <= (l - 1) / fib[n - 1]; ++ x)
if ((l - fib[n - 1] * x) % fib[n] == 0)
{
y = (l - fib[n - 1] * x) / fib[n];
if (x && y && ok(x, y))
{
a = x;
b = y;
break;
}
}
}
else
{
for (x = (l - 1) / fib[n - 1]; x >= 1; -- x)
if ((l - fib[n - 1] * x) % fib[n] == 0)
{
y = (l - fib[n - 1] * x) / fib[n];
++ nrsol;
if (x && y && ok(x, y))
{
if (a == 0 || b > y)
{
a = x;
b = y;
}
}
}
}
}
void write()
{
int i;
freopen("lampa.out", "w", stdout);
if (a == b && a == 0)
{
printf("0");
exit(0);
}
if (!(n % 2))
{
swap(a, b);
for (i = a; i < a + b; ++ i)
printf("%c", s[i]);
printf("\n");
for (i = 0; i < a; ++ i)
printf("%c", s[i]);
}
else
{
for (i = 0; i < a; ++ i)
printf("%c", s[i]);
printf("\n");
for (i = a; i < a + b; ++ i)
printf("%c", s[i]);
}
}
int main()
{
read();
solve();
write();
return 0;
}