Cod sursa(job #1635169)

Utilizator Athena99Anghel Anca Athena99 Data 6 martie 2016 15:12:52
Problema Lampa Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.14 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], k[2];

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

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

    for ( int i= 0, j= 0, t= n%2; i<(int)s2[t].size(); ++i ) {
        if ( s2[t][i]=='a' ) {
            for ( int cnt= 0; cnt<(int)k[1].size(); ++cnt, ++j ) {
                if ( k[1][cnt]!=s[j] )
                    return 0;
            }
        } else {
            for ( int cnt= 0; cnt<(int)k[0].size(); ++cnt, ++j ) {
                if ( k[0][cnt]!=s[j] )
                    return 0;
            }
        }
    }

    return 1;
}

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;
}