#include "bits/stdc++.h" #include using namespace std; using ll = long long; using vll = vector; using pll = pair; using vpll = vector; #define reps(i, a, n) for (ll i = (a); i < (ll)(n); ++i) #define rep(i, n) reps(i, 0, n) #define rrep(i, n) reps(i, 1, n + 1) #define repd(i,n) for(ll i=n-1;i>=0;i--) #define rrepd(i,n) for(ll i=n;i>=1;i--) #define repsd(i, a, n) for(ll i=n;i>=a;i--) #define fore(i,a) for(auto &i:a) ll pow_int(ll x, ll p) { ll res = 1; for (int i = 0; i < p; i++) res *= x; return res; } vll divisor(ll n) { vll ret; for (ll i = 1; i * i <= n; i++) { if (n % i == 0) { ret.push_back(i); if (i * i != n) ret.push_back(n / i); } } sort(begin(ret), end(ret)); return ret; } ll sqrt_ceil(ll n) { ll res = sqrt(n); while((res + 1) * (res + 1) <= n) res++; return res; } ll cbrt_ceil(ll n) { ll res = cbrt(n); while ((res + 1) * (res + 1) * (res + 1) <= n) res++; return res; } int main() { ll n; cin >> n; vector> ans; // d = r-l+1 によって場合分け vll divisors; // Eが2のとき divisors = divisor(6 * n); // 6*n = d * (2*d*d-6*d*r-3*d+6*r*r+6*r+1) // r = sqrt((12*n/d-d*d+1)/3)+d-1/2 fore(d, divisors) { ll r = (sqrt_ceil((12 * n / d - d * d + 1) / 3) + d - 1) / 2; if (6 * n != d * (2 * d * d - 6 * d * r - 3 * d + 6 * r * r + 6 * r + 1)) continue; ll l = r - d + 1; if(l<=0) continue; ans.push_back({ 2,l,r }); } // Eが3のとき divisors = divisor(4 * n); // 4*n = d * (2*r-d+1)*(d*d-2*d*r-d+2*r*r+2*r) fore(d, divisors) { ll ng = cbrt_ceil(n) + 1, ok = d; if (ok > ng) continue; while (abs(ok - ng) > 1) { ll mid = ok + ng >> 1; if (4 * n >= mid * mid * (mid + 1) * (mid + 1) - (mid - d) * (mid - d) * (mid - d + 1) * (mid - d + 1)) ok = mid; else ng = mid; } if (4 * n != ok * ok * (ok + 1) * (ok + 1) - (ok - d) * (ok - d) * (ok - d + 1) * (ok - d + 1)) continue; ll r = ok; ll l = r - d + 1; ans.push_back({ 3,l,r }); } // Eが4以上のとき int E = 4; while (true) { if (pow_int(2, E) > n) break; vll cum; ll sum = 0; ll k = 0; while (true) { ll tmp = pow_int(k, E); if (tmp > n) break; sum += tmp; cum.push_back(sum); auto it = lower_bound(cum.begin(), cum.end(), sum - n); if (it != cum.end() && *it == sum - n) { ans.push_back({ E, it - cum.begin() + 1, k }); } k++; } E++; } sort(ans.begin(), ans.end()); cout << ans.size() << "\n"; for (auto e : ans) { cout << e[0] << " " << e[1] << " " << e[2] << "\n"; } }