#include <stdio.h>
#include <string.h>
#define NMAX 212
#define LMAX 150
#define ll long long
char line[NMAX];
int A[NMAX],B[NMAX],act[NMAX],act2[NMAX],ncif;
inline int cif(char x)
{
return x>='0' && x<='9';
}
void read()
{
fgets(line+1,NMAX,stdin);
while (cif(line[A[0]+1]))
A[++A[0]]=line[A[0]]-'0';
int i,t;
for (i=1; i<=A[0]/2; i++)
t=A[i],A[i]=A[A[0]-i+1],A[A[0]-i+1]=t;
}
void mul(int A[], int B[])
{
int i, j, t, C[NMAX];
memset(C, 0, sizeof(C));
for (i = 1; i <= A[0]; i++)
{
for (t=0, j=1; j <= B[0] || t; j++, t/=10)
C[i+j-1]=(t+=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));
}
int bigger(int poz,int nr_zero,int exp)
{
memset(B,0,sizeof(B));
memset(act2,0,sizeof(act2));
act2[0]=1; act2[1]=1;
B[0]=poz;
int i;
for (i=1; i<=poz; i++)
B[poz-i+1]=act[i];
for (i=1; i<=exp; i++)
{
mul(act2,B);
if (act[0]>A[0])
return 1;
}
if (act2[0]+nr_zero>A[0])
return 1;
if (act2[0]+nr_zero<A[0])
return 0;
for (i=1; i<=act2[0]; i++)
{
if (act2[act2[0]-i+1]>A[A[0]-i+1])
return 1;
if (act2[act2[0]-i+1]<A[A[0]-i+1])
return 0;
}
return 0;
}
inline int egal(int exp)
{
memset(B,0,sizeof(B));
memset(act2,0,sizeof(act2));
act2[0]=1; act2[1]=1;
B[0]=act[0];
int i;
for (i=1; i<=act[0]; i++)
B[act[0]-i+1]=act[i];
for (i=1; i<=exp; i++)
{
mul(act2,B);
if (act2[0]>A[0])
return 0;
}
if (act2[0]!=A[0])
return 0;
for (i=1; i<=act2[0]; i++)
if (act2[i]!=A[i])
return 0;
return 1;
}
int cbin(int exp)
{
int i,step;
ncif=(A[0]-1)/exp+1;
memset(act,0,sizeof(act));
act[0]=ncif;
for (i=1; i<=ncif; i++)
{
step=(1<<3);
while (step)
{
if (act[i]+step<=9)
{
act[i]+=step;
if ( bigger(i,(ncif-i)*exp,exp) )
act[i]-=step;
}
step>>=1;
}
}
if (egal(exp))
return 1;
return 0;
}
void solve()
{
int i,j;
for (i=155; i>=2; i--)
if (cbin(i))
{
for (j=1; j<=act[0]; j++)
printf("%d",act[j]);
printf("\n%d\n",i);
return ;
}
printf("%s\n1\n",line+1);
}
int main()
{
freopen("numere2.in","r",stdin);
freopen("numere2.out","w",stdout);
read();
solve();
return 0;
}