Cod sursa(job #1635017)

Utilizator Athena99Anghel Anca Athena99 Data 6 martie 2016 14:51:05
Problema Lampa Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <fstream>
#include <string>

using namespace std;

ifstream fin("lampa.in");
ofstream fout("lampa.out");

const int nmax= 17;

int n, m;
int fib[nmax+1];
string s, s2[2];

bool check( int a, int b ) {
    if ( a*b==0 )
        return 0;

    s2[0].clear(), s2[1].clear();
    if ( n%2==1 ) {
        for ( int i= 0; i<a; ++i ) {
            s2[1].push_back(s[i]);
        }
        for ( int i= a; i<a+b; ++i ) {
            s2[0].push_back(s[i]);
        }
    } else {
        for ( int i= b; i<a+b; ++i ) {
            s2[1].push_back(s[i]);
        }
        for ( int i= 0; i<b; ++i ) {
            s2[0].push_back(s[i]);
        }
    }

    for ( int i= 3, t= 1; i<=n; ++i, t^= 1 ) {
        for ( int j= 0; j<s2[t^1].size(); ++j ) {
            s2[t].push_back(s2[t^1][j]);
        }
    }

    if ( s==s2[n%2] )
        return 1;
    return 0;
}

int main(  ) {
    fib[1]= fib[2]= 1;
    for ( int i= 3; i<=nmax; ++i ) {
        fib[i]= fib[i-1]+fib[i-2];
    }

    fin>>n>>m>>s;

    int a= fib[n-2], b= fib[n-1], a2, x, y;
    for ( a2= 0; a2<=b-1 && a*a2%b!=1; ++a2 ) ;
    for ( x= (m*a2)%b, y= (m-a*x)/b; check(x, y)==0; ) {
        x+= b;
        y= (m-a*x)/b;
    }

    if ( n%2==1 ) {
        for ( int i= 0; i<x; ++i ) {
            fout<<s[i];
        }
        fout<<"\n";
        for ( int i= x; i<x+y; ++i ) {
            fout<<s[i];
        }
        fout<<"\n";
    } else {
        for ( int i= y; i<x+y; ++i ) {
            fout<<s[i];
        }
        fout<<"\n";
        for ( int i= 0; i<y; ++i ) {
            fout<<s[i];
        }
        fout<<"\n";
    }

    return 0;
}