Pagini recente » Cod sursa (job #2987817) | Cod sursa (job #456524) | Cod sursa (job #3154835) | Cod sursa (job #2358686) | Cod sursa (job #461461)
Cod sursa(job #461461)
#include <cstdio>
const char FIN[] = "lampa.in", FOU[] = "lampa.out";
const int MAX = 30000;
int fib[25], N, M;
char sirD[MAX * 101], aux[MAX * 7];
char sirI1[MAX], sirI2[MAX];
void prec ()
{
fib[1] = fib[2] = 1;
for ( int i = 3; i <= N; ++i) fib[i] = fib[i - 2] + fib[i - 1] ;
aux[ fib[N] - 1 ] = '1', aux[ fib[N] ] = '2';
for ( int i = 4; i <= N; ++i)
for ( int j = fib[N] - fib[i] + 1; j <= fib[N] - fib[i - 1]; ++j)
aux[j] = aux[ j + fib[i - 1] ];
}
int verif (int length1, int length2)
{
if ( N & 1 )
for (int i = 1; i <= length1 || i <= length2 ; ++i) ( i <= length1 ? sirI1[i] = sirD[i] : 0 ), ( i <= length2 ? sirI2[i] = sirD[ i + length1 ] : 0 );
else
for (int i = 1; i <= length1 || i <= length2 ; ++i) ( i <= length1 ? sirI1[i] = sirD[ i + length2 ] : 0 ), ( i <= length2 ? sirI2[i] = sirD[i] : 0 );
for (int i = 1, j = 0; i <= fib[N]; ++i)
{
int ln = 1 ;
if ( aux[i] == '1' )
for ( ; ln <= length1 ; ++ln)
if ( sirI1[ ln ] != sirD[ j + ln ] ) return 0;
if ( aux[i] == '2' )
for ( ; ln <= length2 ; ++ln)
if ( sirI2[ ln ] != sirD[ j + ln ] ) return 0;
j += ln - 1;
}
sirI1[ length1 + 1 ] = 0, sirI2[ length2 + 1 ] = 0;
printf ( "%s\n%s", sirI1 + 1 , sirI2 + 1 ) ;
return 1;
}
int main ()
{
freopen (FIN , "r" , stdin);
freopen (FOU , "w" , stdout);
scanf ("%d %d\n", &N, &M);
fgets( sirD + 1, MAX * 101, stdin);
prec () ;
for (int i = 1; i <= M; ++i)
if ( M - i * fib[ N - 2 ] <= 0 ) break;
else if ( ( M - i * fib[ N - 2 ] ) % fib[ N - 1 ] == 0 )
if ( verif ( i , ( M - i * fib[ N - 2 ] ) / fib[ N - 1 ] ) )
return 0;
printf ("0");
return 0;
}