Pagini recente » Cod sursa (job #1536220) | Cod sursa (job #768928) | Cod sursa (job #325725) | Cod sursa (job #449685) | Cod sursa (job #2091842)
#include <bits/stdc++.h>
#define in "lampa.in"
#define out "lampa.out"
#define MN 32
using namespace std;
int N, M, CF[MN];
deque < pair < int, int > > psbl;
char S[3027200], ord[2][130000];
int main()
{
assert(freopen(in, "r", stdin));
assert(freopen(out,"w", stdout));
assert(scanf("%d%d%s", &N, &M, S));
CF[1] = CF[2] = 1; ord[1][0] = 'a', ord[0][0] = 'b';
for(int i = 3, poz = i&1; i <= N; ++i, poz = 1-poz)
{
CF[i] = CF[i-2] + CF[i-1];
strcat(ord[poz], ord[1-poz]);
}
int Acf = CF[N-2], Bcf = CF[N-1];
if(N&1)
for(int i = 1; i*Acf <= M; ++i)
if((M-Acf*i) % Bcf == 0)
psbl.push_back(make_pair(i, (M-Acf*i)/Bcf));
else
for(int i = 1; i*Bcf <= M; ++i)
if((M-Bcf*i) % Acf == 0)
psbl.push_back(make_pair(i, (M-Bcf*i)/Acf));
while(!psbl.empty())
{
int asize = psbl.front().first,
bsize = psbl.front().second,
stick = 0;
psbl.pop_front();
bool ok = 1;
if(N&1)
{
for(int i = 0; i < Acf+Bcf && ok; ++i)
{
if(ord[N&1][i] == 'a')
{
for(int j = 0; j < asize; ++j)
if(S[stick+j] != S[j])
ok = 0;
stick += asize;
}
else
{
for(int j = 0; j < bsize; ++j)
if(S[stick+j] != S[asize+j])
ok = 0;
stick += bsize;
}
}
}
else
{
for(int i = 0; i < Acf+Bcf && ok; ++i)
{
if(ord[N&1][i] == 'b')
{
for(int j = 0; j < bsize; ++j)
if(S[stick+j] != S[j])
ok = 0;
stick += bsize;
}
else
{
for(int j = 0; j < asize; ++j)
if(S[stick+j] != S[bsize+j])
ok = 0;
stick += asize;
}
}
}
if(ok)
{
for(int i = 0; i < asize; ++i)
assert(printf("%c", S[i]));
assert(printf("\n"));
for(int i = asize; i < asize+bsize; ++i)
assert(printf("%c", S[i]));
while(!psbl.empty()) psbl.pop_back();
}
}
fclose(stdin), fclose(stdout);
return 0;
}