#include #include #include #include using namespace std; const int N = 300010; string ans; int n, f[N]; int main() { // freopen("mess.in", "r", stdin); // freopen("mess.out", "w", stdout); scanf("%d", &n); memset(f, 0x3f, sizeof(f)); f[0] = 0; for (int i = 1; i <= n; ++i) { for (int j = 1; j <= sqrt(i); ++j) { f[i] = min(f[i], j + f[i - j * j]); } } int len = f[n], s = 0; // 需要拼接的长度,新的串的首位的值 bool odd_ok = true; while (true) { if (!len) break; if (odd_ok) { for (int i = 1; i <= len && i * i <= n; i += 2) { if (f[n - i * i] + i == len) { len -= i; n -= i * i; for (int j = 1; j <= i; ++j) { if (j % 2 == 1) ans += '0'; else ans += '1'; } break; } if (i >= min(len, (int) sqrt(n)) - 2) odd_ok = false; } } if (!odd_ok) { if (s == 0) { for (int i = min(len, (int) sqrt(n)) / 2 * 2; i >= 2; i -= 2) { if (f[n - i * i] + i == len) { len -= i; n -= i * i; for (int j = 1; j <= i; ++j) { if (j % 2 == 1) ans += '0'; else ans += '1'; } s = 1; break; } } } else { for (int i = 2; i <= min(len, (int) sqrt(n)) / 2 * 2; i += 2) { if (f[n - i * i] + i == len) { len -= i; n -= i * i; for (int j = 1; j <= i; ++j) { if (j % 2 == 1) ans += '1'; else ans += '0'; } s = 0; break; } } } } } cout << ans << endl; return 0; }