#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cassert>
#define BASE 10000
#define nbase 9
#define LUNG 30
#define PRTF "%04d"
inline void print(int *a)
{
int t, p, i, j;
printf ("%d\n" ,a[a[0]]);
for (i = a[0] - 1; i ; --i)
{
t = 0; p = a[i];
while ( p ) p /= 10, ++t;
for (j = 1; j <= nbase - t; ++j) printf("0");
if ( a[i] ) printf(PRTF, a[i]);
}
}
void set(int *A, int X)
{
memset(A, 0, sizeof(int)*LUNG);
A[0] = 0;
while (X)
{
++A[0];
A[A[0]] = X % BASE;
X /= BASE;
}
}
void mul(int *A, int B)
{
int i, t = 0;
for (i = 1; i <= A[0] || t; i++, t /= BASE)
A[i] = (t += A[i] * B) % BASE;
A[0] = i - 1;
}
void div_2(int *a)
{
int rest = 0;
int i;
for (i = a[0]; i > 0; -- i)
{
a[i] = rest*BASE+a[i];
rest = a[i] % 2;
a[i] /= 2;
}
while (a[a[0]] == 0 && a[0] > 0)
a[0] --;
}
void add(int *a, int scalar)
{
int i;
for (i = 1; i <= a[0] && scalar != 0; ++ i)
{
scalar += a[i];
a[i] = scalar % BASE;
scalar /= BASE;
}
while (scalar)
{
a[i ++] = scalar % BASE;
scalar /= BASE;
}
if (i > a[0])
a[0] = i-1;
}
void dec(int *a)
{
int i = 1;
while (a[i] == 0)
a[i ++] = BASE-1;
a[i] --;
if (i == a[0] && a[i] == 0)
a[0] --;
}
inline int cmp(int *A, int *B)
{
if (A[0] < B[0]) return -1;
else if (A[0] > B[0]) return 1;
for (int i = A[0]; i > 0; --i)
if (A[i] < B[i]) return -1;
else if (A[i] > B[i]) return 1;
return 0;
}
void mul_(int *A, const int *B)
{
int i, j, t, C[LUNG];
memset(C, 0, sizeof(C));
for (i = 1; i <= A[0]; i++)
{
for (t=0, j=1; j <= B[0] || t; j++, t/=BASE)
C[i+j-1]=(t+=C[i+j-1]+A[i]*B[j])%BASE;
if (i + j - 2 > C[0]) C[0] = i + j - 2;
}
memcpy(A, C, sizeof(C));
}
void add_(int *A, const int *B)
{
int i, t = 0;
for (i=1; i<=A[0] || i<=B[0] || t; i++, t/=BASE)
A[i] = (t += A[i] + B[i]) % BASE;
A[0] = i - 1;
}
void power(const int *a, int b, int *c)
{
int i;
set(c, 1);
for (i = 0; i < b; ++ i)
mul_(c, a);
}
int P[LUNG];
int T[LUNG];
int B;
int main()
{
int *left = (int*) malloc(sizeof(int)*LUNG);
int *right = (int*) malloc(sizeof(int)*LUNG);
int *mid = (int*) malloc(sizeof(int)*LUNG);
char ch;
freopen("numere2.in", "rt", stdin);
freopen("numere2.out", "wt", stdout);
set(P, 0);
while (scanf(" %c", &ch) == 1) //aici trebe lucrat ....
{
mul(P, 10);
add(P, (int)(ch - '0'));
}
set(T, 1);
B = 0;
while (cmp(T, P) < 0)
{
mul(T, 2);
B ++;
}
if (cmp(T, P) == 0)
{
printf("%d\n%d\n", 2, B);
return 0;
}
B --;
while (B > 0)
{
set(left, 2);
set(right, 1);
do
{
mul(right, 2);
power(right, B, T);
}
while (cmp(T, P) < 0);
while (cmp(left, right) <= 0)
{
int res;
memcpy(mid, left, sizeof(int)*LUNG);
add_(mid, right);
div_2(mid);
power(mid, B, T);
res = cmp(T, P);
if (res == 0)
{
print(mid);
printf("%d\n", B);
return 0;
}
if (res < 0)
{
int *temp = left;
left = mid;
mid = temp;
add(left, 1);
}
else
{
int *temp = right;
right = mid;
mid = temp;
dec(right);
}
}
B --;
}
return 0;
}