Cod sursa(job #665082)

Utilizator danalex97Dan H Alexandru danalex97 Data 21 ianuarie 2012 17:10:37
Problema Lampa Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <fstream>
#include <algorithm>
#include <bitset>
using namespace std;

#define MAX 3500000
#define LOG 30

char s[MAX],s1[MAX],s2[MAX];
bitset <MAX> viz;
int f[LOG];
int n,m;


void read ()
{
    scanf ("%d%d\n",&n,&m);
    fgets (s+1,MAX,stdin);
}

int final (int n1,int n2)
{
    int i,j,k;

    if (n&1)
        for (i=1; i<=n1 || i<=n2; ++i)
        {
            if (i<=n1)
                s1[i]=s[i];
            else
                s1[i]=0;
            if (i<=n2)
                s2[i]=s[i+n1];
            else
                s2[i]=0;
        }
    else
        for (i=1; i<=n1 || i<=n2; ++i)
        {
            if (i<=n1)
                s1[i]=s[i+n2];
            else
                s1[i]=0;
            if (i<=n2)
                s2[i]=s[i];
            else
                s2[i]=0;
        }
    for (i=1, j=0; i<=f[n]; ++i, j+=k-1)
        if (!viz[i])
        {
            for (k=1; k<=n1; ++k)
                if (s1[k]!=s[j+k])
                    return 0;
        }
        else
        {
            for (k=1; k<=n2; ++k)
                if (s2[k]!=s[j+k])
                    return 0;
        }
    s1[n1+1]=s2[n2+1]='\0';
    printf ("%s\n%s",s1+1,s2+1);
    return 1;
}

void solve ()
{
    int i,j;

    f[1]=f[2]=1;
    for (i=3; i<=n; ++i)
        f[i]=f[i-1]+f[i-2];
    viz[f[n]]=1;
    for (i=4; i<=n; ++i)
        for (j=f[n]-f[i]+1; j<=f[n]-f[i-1]; ++j)
            viz[j]=viz[j+f[i-1]];
    for (i=1; i*f[n-2]<=m; ++i)
        if ((m-i*f[n-2])%f[n-1]==0)
            if (final (i,(m-i*f[n-2])/f[n-1]))
                return ;
    printf ("0");
}

int main ()
{
    freopen ("lampa.in","r",stdin);
    freopen ("lampa.out","w",stdout);

    read ();
    solve ();

    return 0;
}