#include<stdio.h>
#define MAXX 3001
FILE *in, *out;
char v[MAXX], dec[MAXX], predec[MAXX], dscz[MAXX];
int nrv, nrdec, nrpredec, nrdscz;
int cmp(char a[], char b[], int lunga, int lungb)
{
int i;
i = lunga - 1;
while(a[i] == 0 && i >= 0) {
lunga = lunga - 1;
i--;
}
i = lungb - 1;
while(b[i] == 0 && i >= 0) {
lungb = lungb - 1;
i--;
}
if(lunga > lungb) {
return 1;
}
if(lungb > lunga) {
return -1;
}
i = lunga - 1;
while( b[i] == a[i] && i >= 0) {
i--;
}
if(i < 0) {
return 0;
}
if(a[i] > b[i]) {
return 1;
}
if(b[i] > a[i]) {
return -1;
}
return 0;
}
int cp(char a[], char b[], int lunga)
{
int i;
for(i = 0; i < lunga; i++) {
b[i] = a[i];
}
return lunga;
}
int shift(char a[], int lunga, int dur)
{
int i;
i = lunga - 1;
while(a[i] == 0 && i >= 0) {
lunga = lunga - 1;
i--;
}
for(i = lunga - 1; i >= 0; i--) {
a[i + dur] = a[i];
}
for(i = 0; i < dur; i++) {
a[i] = 0;
}
lunga = lunga + dur;
return lunga;
}
int inmultire(char a[], int lunga, int scalar)
{
int i, transport;
transport = 0;
for(i = 0; i < lunga; i++) {
a[i] = a[i] * scalar + transport;
transport = a[i] / 10;
a[i] = a[i] % 10;
}
if(transport > 0) {
a[lunga] = transport;
lunga = lunga + 1;
}
return lunga;
}
int adunare(char a[], int lunga, int scalar)
{
int i, transport, xa;
transport = scalar;
for(i = 0; i < lunga; i++) {
xa = a[i] + transport;
if(xa >= 10) {
transport = xa / 10;
xa = xa % 10;
} else {
transport = 0;
}
a[i] = xa;
}
if(transport >= 0) {
i = lunga;
while(transport > 0) {
a[i] = transport % 10;
i++;
transport = transport / 10;
}
lunga = i;
}
return lunga;
}
int scadere(char a[], char b[], int lunga, int lungb)
{
int i, transport, xa;
transport = 0;
for(i = 0; i < lunga; i++) {
xa = a[i] - transport;
if(xa < 0) {
xa = xa + 10;
transport = 1;
}
xa = xa - b[i];
if(xa < 0) {
xa = xa + 10;
transport = 1;
}
a[i] = xa;
}
i = lunga - 1;
while(a[i] == 0) {
lunga = lunga - 1;
i = i - 1;
}
return lunga;
}
int find(char a[], char b[], int lunga, int lungb)
{
int i, lungc;
char c[MAXX];
lungc = cp(a , c, lunga);
i = 10;
do
{
i = i - 1;
lunga = cp(c , a, lungc);
lunga = shift(a, lunga, 1);
lunga = adunare(a, lunga, i);
lunga = inmultire(a, lunga, i);
}
while(cmp(a, b, lunga, lungb) == 1 && i >= 0);
return i;
}
void init()
{
int i, aux;
char c;
i = 0;
c = fgetc(in);
do
{
v[i] = c - '0';
i++;
c = fgetc(in);
}
while(c != EOF);
nrv = i - 1;
for(i = 0; i < nrv / 2; i++) {
aux = v[i];
v[i] = v[nrv - i - 1];
v[nrv - i - 1] = aux;
}
}
int main ()
{
int x, i, j;
in = fopen("sqrt.in", "r");
out = fopen("sqrt.out", "w");
init();
if(nrv % 2 == 0) {
x = v[nrv - 1] * 10 + v[nrv - 2];
} else {
x = v[nrv - 1];
}
i = 10;
while(i * i > x) {
i = i - 1;
}
fprintf(out, "%d", i);
dec[0] = i;
nrdec = 1;
predec[0] = i;
nrpredec = 1;
/*
dec[0] = 8;
dec[1] = 1;
dec[2] = 3;
nrdec = 3;
dscz[0] = 9;
dscz[1] = 2;
dscz[2] = 2;
nrdscz = 3;
//printf("%d\n\n", cmp(dec, dscz, nrdec, nrdscz));
//x = find(dec, dscz, nrdec, nrdscz);
nrdec = scadere(dec, dscz, nrdec, nrdscz);
for(j = nrdec - 1; j >= 0; j--) {
printf("%d ", dec[j]);
}
//printf("\n%d\n", x);
//*/
//*
nrdec = adunare(dec, nrdec, i);
x = x - (i * i);
if(x > 10) {
dscz[0] = x % 10;
dscz[1] = x / 10;
nrdscz = 2;
} else {
dscz[0] = x;
nrdscz = 1;
}
if(nrv % 2 == 0) {
i = 2;
} else {
i = 1;
}
i = nrv - i - 1;
//printf("%d\n", i);
for(i = i; i > 0; i = i - 2) {
shift(dscz, nrdscz, 2);
dscz[1] = v[i];
dscz[0] = v[i - 1];
nrdscz = nrdscz + 2;
nrpredec = cp(dec, predec, nrdec);
x = find(dec, dscz, nrdec, nrdscz);
nrdscz = scadere(dscz, dec, nrdscz, nrdec);
fprintf(out, "%d", x);
nrdec = cp(predec, dec, nrpredec);
nrdec = shift(dec, nrdec, 1);
nrdec = adunare(dec, nrdec, 2 * x);
nrdscz = cp(dscz, dscz, nrdscz);
}
//*/
fclose(in);
fclose(out);
return 0;
}