Cod sursa(job #732001)

Utilizator GavrilaVladGavrila Vlad GavrilaVlad Data 9 aprilie 2012 15:32:35
Problema Numere 2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.88 kb
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

#define maxn 110
#define baza 10

int n, m;
int v[maxn], aux[maxn], pt2[maxn], tr[maxn], doi[maxn], d[maxn], sol[maxn];
char s[maxn];

void inm(int a[], int b[], int c[])
{
    memset(aux, 0, sizeof(aux));
    int t=0;
    for(int i=1; i<=a[0]; ++i)
    {
        t=0;
        for(int j=1; j<=b[0] || t>0; ++j)
        {
            t+=a[i]*b[j]+aux[i+j-1];
            aux[i+j-1]=t%baza;
            t/=baza;
            aux[0]=max(aux[0], i+j-1);
        }
    }
    for(int i=1; i<=c[0]; ++i)
        c[i]=0;
    for(int i=0; i<=aux[0]; ++i)
        c[i]=aux[i];
}

void imp(int a[], int b, int c[])
{
    memset(aux, 0, sizeof(aux));

    aux[0]=a[0];
    int t=0;
    for(int i=a[0]; i; --i)
    {
        t=t*baza+a[i];
        aux[i]=t/b;
        t%=b;
    }

    while(aux[aux[0]]==0 && aux[0]>1)
        --aux[0];

    for(int i=1; i<=c[0]; ++i)
        c[i]=0;
    for(int i=0; i<=aux[0]; ++i)
        c[i]=aux[i];
}

void add(int a[], int b[], int c[])
{
    memset(aux, 0, sizeof(aux));
    int t=0;
    for(int i=1; i<=a[0] || i<=b[0] || t>0; ++i)
    {
        t+=a[i]+b[i];
        aux[i]=t%baza;
        t/=baza;
        aux[0]=i;
    }

    for(int i=1; i<=c[0]; ++i)
        c[i]=0;
    for(int i=0; i<=aux[0]; ++i)
        c[i]=aux[i];
}

void afisare(int v[])
{
    for(int i=v[0]; i; --i)
        printf("%d", v[i]);
    printf("\n");
   // printf(" %d\n", v[0]);
}

int compare(int a[], int b[])
{
    if(a[0]<b[0])
        return -1;
    if(a[0]>b[0])
        return 1;
    for(int i=a[0]; i; --i)
    {
        if(a[i]>b[i])
            return 1;
        if(a[i]<b[i])
            return -1;
    }
 //   printf("!!!!!!!!!\n");
    return 0;
}

int solve(int e)
{
  //  printf("!%d\n", e);

    int pt=0;
    memset(sol, 0, sizeof(sol));
    pt2[0]=1;
    pt2[1]=1;
    while((pt2[0]-1)*e<=v[0])
    {
        ++pt;
        inm(pt2, doi, pt2);
    }

    memset(tr, 0, sizeof(tr));
    for(; pt>=0; --pt)
    {
        add(sol, pt2, tr);
        memset(d, 0, sizeof(d));

        d[0]=d[1]=1;

        for(int i=1; i<=e; ++i)
        {
            inm(d, tr, d);
            if(d[0]>v[0])
                break;
        }

      //  afisare(tr);
     //   afisare(d);
     //   afisare(v);

        if(compare(d, v)<=0)
        {
            add(sol, pt2, sol);
            if(compare(d, v)==0)
                return 1;
        }

      //  afisare(sol);
      //  printf("\n");

        imp(pt2, 2, pt2);
    }

 //   printf("\n");

    return 0;
}


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

    scanf("%s", s);
    v[0]=strlen(s);
    for(int i=1; i<=v[0]; ++i)
        v[i]=s[v[0]-i]-'0';

    doi[0]=1;
    doi[1]=2;

    for(int i=240; i; --i)
        if(solve(i))
        {
            afisare(sol);
            printf("%d\n", i);
            return 0;
        }

    return 0;
}