sqrt
#include <vector> #include <list> #include <map> #include <set> #include <deque> #include <queue> #include <stack> #include <bitset> #include <algorithm> #include <functional> #include <numeric> #include <utility> #include <sstream> #include <iostream> #include <iomanip> #include <cstdio> #include <cmath> #include <cstdlib> #include <cctype> #include <string> #include <cstring> #include <ctime> #include <fstream> using namespace std; #define maxlen 4000 void mul(int k, int a[], int *lena) { for(int i = 0; i < *lena; i++) a[i] *= k; for(int i = 0; i < *lena; i++) { a[i + 1] += a[i] / 10; a[i] %= 10; } while(a[*lena]) { a[*lena + 1] += a[*lena] / 10; a[*lena] %= 10; (*lena)++; } return; } bool judge(int a[], int lena, int b[], int lenb) { if(lena < lenb) return 0; for(int i = lena - 1; i >= 0; i--) if(a[i] > b[i]) return 1; else if(a[i] < b[i]) return 0; return 0; } bool func(int m, int nr[], int lennr, int R[], int lenR) { mul(20 * m, nr, &lennr); nr[0] += m * m; lennr = max(lennr, 1); for(int i = 0; i < lennr; i++) { nr[i + 1] += nr[i] / 10; nr[i] %= 10; } while(nr[lennr]) { nr[lennr + 1] += nr[lennr] / 10; nr[lennr] %= 10; lennr++; } return judge(nr, lennr, R, lenR); } void newR(int k, int r[], int lenr, int R[], int *lenR) { mul(20 * k, r, &lenr); for(int i = 0; i < *lenR; i++) { R[i] -= r[i]; if(!i) R[i] -= k * k; while(R[i] < 0) { R[i] += 10; R[i + 1]--; } } while(*lenR && !R[*lenR - 1]) (*lenR)--; return; } int main() { int N[maxlen], lenN, R[maxlen], lenR = 0, r[maxlen], lenr = 0; memset(N, 0, sizeof(N)); memset(R, 0, sizeof(R)); memset(r, 0, sizeof(r)); string str; cin >> str; lenN = str.size(); for(int i = lenN - 1; i >= 0; i--) N[i] = (char)str[lenN - 1 - i] - '0'; /*check the number for(int i = lenN - 1; i >= 0; i--) cout << N[i]; cout << endl; */ for(int i = lenN - 1; i >= 0; i--) { if(i & 1) continue; for(int j = lenR - 1; j >= 0; j--) R[j + 2] = R[j]; R[1] = N[i + 1]; R[0] = N[i]; lenR += 2; while(lenR && !R[lenR - 1]) lenR--; int k, nr[maxlen], lennr = lenr; for(k = 0; k < 10; k++) { memcpy(nr, r, sizeof(nr)); if(func(k + 1, nr, lennr, R, lenR)) break; } memcpy(nr, r, sizeof(nr)); newR(k, nr, lennr, R, &lenR); for(int j = lenr - 1; j >= 0; j--) r[j + 1] = r[j]; r[0] = k; lenr++; } for(int i = lenr - 1; i >= 0; i--) cout << r[i]; cout << endl; return 0; }