Cod sursa(job #2619925)

Utilizator DavidAA007Apostol David DavidAA007 Data 28 mai 2020 14:35:03
Problema Numere 2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 4.12 kb
#include<iostream>
#include<fstream>
#include<algorithm>
#include<string.h>
#include<math.h>
using namespace std;
ifstream fin("numere2.in");
ofstream fout("numere2.out");
int P[305],lf[305],rg[305],md[305],base[305],sol[305],tmp[305];
char buffer[105];
void initBinarySearch(int b)
{
    rg[0]=ceil((double)(P[0]+1)/b)+1;
    lf[0]=max(rg[0]-3,0);
    lf[lf[0]]=1;
    for(int i=1;i<rg[0];i++)
        rg[i]=0;
    rg[rg[0]]=1;
}
void CalculateMiddle()
{
    int i;
    int T=0;
    md[0]=rg[0];
    for(i=1;i<=md[0];i++)
    {
        md[i]=rg[i]+lf[i]+T;
        T=md[i]/10;
        md[i]=md[i]%10;
    }
    if(T!=0)
        md[++md[0]]=T;
    T=0;
    for(i=md[0];i>=1;i--)
    {
        T=T*10+md[i];
        md[i]=T/2;
        T=T%2;
    }
    if(md[md[0]]==0 && md[0]>1)
        md[0]--;
}
void calculateRg()
{
    int i,T;
    for(i=0;i<=md[0];i++)
        rg[i]=md[i];
    T=1;
    for(i=1;i<=rg[0];i++)
    {
        rg[i]=rg[i]-T;
        if(rg[i]<0)
        {
            rg[i]=rg[i]+10;
            T=1;
        }
        else
            T=0;
    }
    while(rg[rg[0]]==0 && rg[0]>1)
        rg[0]--;
}
void calculateLf()
{
    int i,T;
    for(i=0;i<=md[0];i++)
        lf[i]=md[i];
    T=1;
    for(i=1;i<=lf[0];i++)
    {
        lf[i]=lf[i]+T;
        T=lf[i]/10;
        lf[i]=lf[i]%10;
    }
    if(T!=0)
        lf[++lf[0]]=T;
}
void calculateSol()
{
    int i,j;
    tmp[0]=sol[0]+base[0]-1;
    for(i=1;i<=tmp[0];i++)
        tmp[i]=0;
    for(i=1;i<=sol[0];i++)
        for(j=1;j<=base[0];j++)
            tmp[i+j-1]=tmp[i+j-1]+sol[i]*base[j];
    int T=0;
    for(i=1;i<=tmp[0];i++)
    {
        tmp[i]=tmp[i]+T;
        T=tmp[i]/10;
        tmp[i]=tmp[i]%10;
    }
    if(T!=0)
        tmp[++tmp[0]]=T;
    for(i=0;i<=tmp[0];i++)
        sol[i]=tmp[i];
}
void calculateBase()
{
    int i,j;
    tmp[0]=base[0]+base[0]-1;
    for(i=1;i<=tmp[0];i++)
        tmp[i]=0;
    for(i=1;i<=base[0];i++)
        for(j=1;j<=base[0];j++)
            tmp[i+j-1]=tmp[i+j-1]+base[i]*base[j];
    int T=0;
    for(i=1;i<=tmp[0];i++)
    {
        tmp[i]=tmp[i]+T;
        T=tmp[i]/10;
        tmp[i]=tmp[i]%10;
    }
    if(T!=0)
        tmp[++tmp[0]]=T;
    for(i=0;i<=tmp[0];i++)
        base[i]=tmp[i];
}
int areEqual(int e)
{
    sol[0]=1;
    sol[1]=1;
    int i;
    for(i=0;i<=md[0];i++)
        base[i]=md[i];
    while(e!=0)
    {
        if(e&1)
            calculateSol();
        calculateBase();
        if(sol[0]>P[0])
            return 1;
        e=e>>1;
    }
    if(sol[0]==P[0])
    {
        for(i=P[0];i>=1;i--)
            if(sol[i]>P[i])
                return 1;
            else
                if(sol[i]<P[i])
                    return -1;
        return 0;
    }
    else
        if(sol[0]>P[0])
            return 1;
    return -1;
}
int compareLfAndRg()
{
    if(lf[0]==rg[0])
    {
        for(int i=rg[0];i>=1;i--)
            if(lf[i]>rg[i])
                return 1;
            else
                if(lf[i]<rg[i])
                    return -1;
        return 0;
    }
    else
        if(lf[0]>rg[0])
            return 1;
    return -1;
}
bool binarySearch(int b)
{
    initBinarySearch(b);
    CalculateMiddle();
    int x;
    while(compareLfAndRg()<=0)
    {
        x=areEqual(b);
        if(x==0)
            return 1;
        else
            if(x==1)
                calculateRg();
            else
                calculateLf();
        CalculateMiddle();
    }
    return 0;
}
int main()
{
    //solutie de 50 de pct, fara numere mari
    /*
    cin>>p;
    if(p==1)
    {
        cout<<1<<"\n";
        return 0;
    }
    for(a=2;;a++)
    {
        r=a;
        b=1;
        if(a*a>p)
            break;
        while(r<p)
        {
            r=r*a;
            b++;
        }
        if(r==p)
        {
            cout<<a<<"\n";
            cout<<b;
            return 0;
        }
    }
    cout<<p;
    cout<<"\n"<<1;
    */
    int i;
    fin>>buffer+1;
    P[0]=strlen(buffer+1);
    for(i=1;i<=P[0];i++)
        P[P[0]-i+1]=buffer[i]-48;
    for(i=100;i>=1;i--)
        if(binarySearch(i))
            break;
    int b=i;
    for(i=md[0];i>=1;i--)
        fout<<md[i];
    fout<<"\n";
    fout<<b;
    fin.close();
    fout.close();
    return 0;
}