#include "bits/stdc++.h" #include using namespace std; using LL = __int128; istream& operator>>(istream& is, LL& v) { string s; is >> s; v = 0; for (int i = 0; i < (int)s.size(); i++) { if (isdigit(s[i])) { v = v * 10 + s[i] - '0'; } } if (s[0] == '-') { v *= -1; } return is; } ostream& operator<<(ostream& os, const LL& v) { if (v == 0) { return (os << "0"); } LL num = v; if (v < 0) { os << '-'; num = -num; } string s; for (; num > 0; num /= 10) { s.push_back((char)(num % 10) + '0'); } reverse(s.begin(), s.end()); return (os << s); } LL cbrt128(LL n) { LL ng = 0, ok = 1; while (ok * ok * ok <= n) ok *= 2; while (ok - ng > 1) { LL mid = (ok + ng) / 2; LL tmp = mid * mid * mid; if (tmp >= n) ok = mid; else ng = mid; } return ok; } LL sqrt128(LL n) { LL ng = 0, ok = 1; while (ok * ok <= n) ok *= 2; while (ok - ng > 1) { LL mid = (ok + ng) / 2; LL tmp = mid * mid; if (tmp >= n) ok = mid; else ng = mid; } return ok; } // r-lをkに固定したとき、二乗和は{r*(r+1)*(2*r+1)-(r-k-1)*(r-k)*(2*r-2*k-1)}/6 LL f2(LL r, LL k) { LL res = (r * (r + 1) * (2 * r + 1) - (r - k - 1) * (r - k) * (2 * r - 2 * k - 1)) / 6; return res; } // r-lをkに固定したとき、三乗和は{r^2(r+1)^2-(r-k-1)^2(r-k)^2}/4 LL f3(LL r, LL k) { LL res = (r * r * (r + 1) * (r + 1) - (r - k - 1) * (r - k - 1) * (r - k) * (r - k)) / 4; return res; } LL pow_int(LL x, LL p) { LL res = 1; for (int i = 0; i < p; i++) res *= x; return res; } int main() { LL n; cin >> n; vector> ans; // Eが2のとき LL k = 0; while (true) { if (f2(k + 1, k) > n) break; LL limit = sqrt128(n) + 2; LL ok = k + 1, ng = limit; while (ng-ok) { LL mid = ok + ng >> 1; if (f2(mid, k) > n) ng = mid; else ok = mid; } if (f2(ok, k) == n) ans.push_back({ 2, ok - k, ok }); k++; } // Eが3のとき k = 0; while (true) { if (f3(k + 1, k) > n) break; LL limit = cbrt128(n) + 2; LL ok = k + 1, ng = limit; while (ng-ok) { LL mid = ok + ng >> 1; if (f3(mid, k) > n) ng = mid; else ok = mid; } if (f3(ok, k) == n) ans.push_back({ 3, ok - k, ok }); k++; } // Eが4以上のとき int E = 4; while (true) { if (pow_int(2, E) > n) break; vector cum; LL sum = 0; k = 0; while (true) { LL tmp = pow_int(k, E); if (tmp > n) break; sum += tmp; cum.push_back(tmp); auto it = lower_bound(cum.begin(), cum.end(), sum - n); if (it != cum.end() && *it == sum - n) { ans.push_back({ E, k, it - cum.begin() }); } k++; } E++; } sort(ans.begin(), ans.end()); cout << ans.size() << "\n"; for (auto e : ans) { cout << e[0] << " " << e[1] << " " << e[2] << "\n"; } }