Pagini recente » Cod sursa (job #1662344) | Cod sursa (job #1736186) | Rating Mohamed Sobhy (mohamedsobhi777) | Cod sursa (job #1963690) | Cod sursa (job #1728144)
#include<cstdio>
#include<cstring>
#define MAXDIGITS 1000
using namespace std;
char s[MAXDIGITS];
int number[MAXDIGITS],answer[MAXDIGITS],temp[MAXDIGITS],base[MAXDIGITS],digits;
void Multiply(int a[MAXDIGITS],int b[MAXDIGITS]){
int i,j,k=0;
int c[MAXDIGITS];
memset(c,0,sizeof(c));
for(i=1;i<=a[0];i++){
for(j=1;j<=b[0]||k>0;j++,k/=10)
c[i+j-1]=(k+=c[i+j-1]+a[i]*b[j])%10;
if(i+j-2>c[0])
c[0]=i+j-2;
}
memcpy(a,c,sizeof(c));
}
bool IsBigger(int position,int zeros,int power){
int i;
memset(base,0,sizeof(base));
memset(temp,0,sizeof(temp));
temp[0]=temp[1]=1;
base[0]=position;
for(i=1;i<=position;i++)
base[position-i+1]=answer[i];
for(i=1;i<=power;i++){
Multiply(temp,base);
if(temp[0]>number[0])
return true;
}
if(temp[0]+zeros>number[0])
return true;
if(temp[0]+zeros<number[0])
return false;
for(i=1;i<=temp[0];i++){
if(temp[temp[0]-i+1]>number[number[0]-i+1])
return true;
if(temp[temp[0]-i+1]<number[number[0]-i+1])
return false;
}
return false;
}
bool Check(int power){
int i;
memset(base,0,sizeof(base));
memset(temp,0,sizeof(temp));
temp[0]=temp[1]=1;
base[0]=answer[0];
for(i=1;i<=answer[0];i++)
base[answer[0]-i+1]=answer[i];
for(i=1;i<=power;i++){
Multiply(temp,base);
if(temp[0]>number[0])
return false;
}
if(temp[0]!=number[0])
return false;
for(i=1;i<=temp[0];i++)
if(temp[i]!=number[i])
return false;
return true;
}
bool BinarySearch(int power){
int i,step;
if(power==4)
i++;
memset(answer,0,sizeof(answer));
digits=(number[0]-1)/power+1;
answer[0]=digits;
for(i=1;i<=digits;i++)
for(step=8;step>0;step/=2)
if(answer[i]+step<=9){
answer[i]+=step;
if(IsBigger(i,(digits-i)*power,power)==true)
answer[i]-=step;
}
return Check(power);
}
int main(){
freopen("numere2.in","r",stdin);
freopen("numere2.out","w",stdout);
int i,n,power;
scanf("%s",s+1);
number[0]=strlen(s+1);
for(i=1;i<=number[0];i++)
number[number[0]-i+1]=s[i]-'0';
for(power=155;power>=2;power--)
if(BinarySearch(power)==true){
for(i=1;i<=answer[0];i++)
printf("%d",answer[i]);
printf("\n%d",power);
return 0;
}
printf("%s\n1",s+1);
return 0;
}