Cod sursa(job #1818669)

Utilizator Bodo171Bogdan Pop Bodo171 Data 29 noiembrie 2016 18:11:21
Problema Numere 2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.14 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("numere2.in");
ofstream g("numere2.out");
const int base=10000;
const int nmax=1000;
string ps;
int p2[360][nmax],aux[nmax],auxiliar[nmax],put2[nmax],k[nmax],p10[5],povv[15],p[nmax],aux2[nmax];
int nr,put,i,j,idx,pp,numar,zero,t,inv;
void mems(int A[])
{
    for(idx=1;idx<=A[0];idx++)
        A[idx]=0;
    A[0]=0;
}
void memc(int X[],int Y[])
{
    for(idx=1;idx<=Y[0];idx++)
       X[idx]=Y[idx];
    for(idx=Y[0]+1;idx<=X[0];idx++)
        X[idx]=0;
    X[0]=Y[0];
}
void ad(int A[],int B[],int C[])
{
    C[0]=max(A[0],B[0]);
    for(idx=1;idx<=C[0];idx++)
    {
        C[idx]+=(A[idx]+B[idx]);
        if(C[idx]>=base)
        {
            C[idx]-=base;
            C[idx+1]++;
            if(idx==C[0]) C[0]++;
        }
    }
}
void mult(int A[],int B[],int C[])
{
    C[0]=A[0]+B[0]-1;
    for(idx=1;idx<=A[0];idx++)
        for(j=1;j<=B[0];j++)
    {
        C[idx+j-1]+=A[idx]*B[j];
        if(C[idx+j-1]>=base)
        {
            C[idx+j]+=C[idx+j-1]/base;
            C[idx+j-1]%=base;
            if(idx+j>C[0]) C[0]=idx+j;
        }
    }
}
void exponent(int A[],int putere,int B[])
{
    mems(put2);
    memc(put2,A);
    for(pp=0;povv[pp]<=putere;pp++)
    {
        if((povv[pp]&putere))
        {
            mems(auxiliar);
            mult(B,put2,auxiliar);
            memc(B,auxiliar);
        }
        mems(auxiliar);
        mult(put2,put2,auxiliar);
        memc(put2,auxiliar);
    }
}
int comp(int A[],int B[])
{
    if(A[0]==B[0])
    {
        for(idx=A[0];idx>=1;idx--)
            if(A[idx]!=B[idx])
        {
            if(A[idx]<B[idx]) return -1;
            if(B[idx]<A[idx]) return 1;
        }
    }
    if(A[0]<B[0]) return -1;
    if(B[0]<A[0]) return 1;
    return 0;
}
void afis(int A[])
{
    zero=4;
    for(idx=A[0];idx>=1;idx--)
    {
        if(idx!=A[0]) numar=A[idx];
        while(numar!=0)
            {numar/=10;zero++;}
        for(j=1;j<=4-zero;j++)
            g<<'0';
        g<<A[idx];
        zero=0;
    }
}
int main()
{
    f>>ps;
    p10[0]=1;povv[0]=1;
    for(i=1;i<4;i++)
        p10[i]=p10[i-1]*10;
    for(i=1;i<=10;i++)
        povv[i]=2*povv[i-1];
    p[0]=ps.size()/4+1;
    for(i=0;i<ps.size();i++)
    {
        j=ps.size()-i-1;
        p[(i/4)+1]=p[(i/4)+1]+p10[i%4]*(ps[j]-'0');
    }
    if(p[p[0]]==0) p[0]--;
    p2[0][0]=1;p2[0][1]=1;
    for(i=1;comp(p2[i-1],p)<=0;i++)
        {ad(p2[i-1],p2[i-1],p2[i]),nr=i;}
    afis(aux);
    for(put=nr;put>=2;put--)
    {
        mems(k);
        for(i=nr/put+1;i>=0;i--)
        {
            mems(aux);
            ad(k,p2[i],aux);
            mems(aux2);
            aux2[0]=1;aux2[1]=1;
            exponent(aux,put,aux2);
            t=comp(aux2,p);
            if(t==0)
            {
                memc(k,aux);
                afis(k);
                g<<'\n';
                g<<put<<'\n';
                return 0;
            }
            if(t==-1)
            {
                memc(k,aux);
            }
        }
    }
    g<<ps<<'\n'<<"1";
    return 0;
}