Cod sursa(job #1728144)

Utilizator fanache99Constantin-Buliga Stefan fanache99 Data 12 iulie 2016 12:50:53
Problema Numere 2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.61 kb
#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;
}