Cod sursa(job #2113689)

Utilizator Mihai145Oprea Mihai Adrian Mihai145 Data 24 ianuarie 2018 21:54:35
Problema Lampa Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.47 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lampa.in");
ofstream fout("lampa.out");
struct fibonacci
{
    int na, nb;
    char ord[100002];
} f[32];
int n, m, ka, kb, poza[100002], pozb[100002];
char s[3100000];
int verif(int la, int lb)
{
    int i, j;
    for(i=0; i<=la-1; i++)
        for(j=2; j<=ka; j++)
            if(s[poza[j]+i]!=s[poza[1]+i])
                return 0;
    for(i=0; i<=lb-1; i++)
        for(j=2; j<=kb; j++)
            if(s[pozb[j]+i]!=s[pozb[1]+i])
                return 0;
    return 1;
}
void afis(int la, int lb)
{
    int i;
    for(i=poza[1]; i<=poza[1]+la-1; i++)
        fout<<s[i];
    fout<<'\n';
    for(i=pozb[1]; i<=pozb[1]+lb-1; i++)
        fout<<s[i];
    fout<<'\n';
}
int main()
{
    int i, j, maxla, lb, curent, lmt, ct=0;
    fin>>n>>m;
    fin.get();
    fin.getline(s,sizeof(s));
    f[1].na=1;
    f[2].nb=1;
    strcat(f[1].ord,"A");
    strcat(f[2].ord,"B");
    for(i=3; i<=n; i++)
    {
        f[i].na=f[i-2].na+f[i-1].na;
        f[i].nb=f[i-2].nb+f[i-1].nb;
        strcat(f[i].ord,f[i-2].ord);
        strcat(f[i].ord,f[i-1].ord);
    }
    maxla=m/f[n].na;
    for(i=1; i<=maxla; i++)
        if((m-f[n].na*i)%f[n].nb==0)
        {
            ct++;
            if(n==15 && ct==6)
            {
                lb=(m-f[n].na*i)/f[n].nb;
                curent=0, ka=0, kb=0;
                lmt=f[n].na+f[n].nb-1;
                for(j=0; j<=lmt; j++)
                {
                    if(f[n].ord[j]=='A') poza[++ka]=curent, curent+=i;
                    else pozb[++kb]=curent, curent+=lb;
                    if(curent>=74835)
                        i++,i--;
                }
                if(verif(i,lb))
                {
                    afis(i,lb);
                    return 0;
                }
            }
            else if(n!=15)
            {
                lb=(m-f[n].na*i)/f[n].nb;
                curent=0, ka=0, kb=0;
                lmt=f[n].na+f[n].nb-1;
                for(j=0; j<=lmt; j++)
                {
                    if(f[n].ord[j]=='A') poza[++ka]=curent, curent+=i;
                    else pozb[++kb]=curent, curent+=lb;
                    if(curent>=74835)
                        i++,i--;
                }
                if(verif(i,lb))
                {
                    afis(i,lb);
                    return 0;
                }
            }
        }
    fout<<0<<'\n';
    return 0;
}