Pagini recente » Cod sursa (job #2344671) | Cod sursa (job #3145312) | Cod sursa (job #3209301) | Cod sursa (job #1448807) | Cod sursa (job #2619925)
#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;
}