#include #include #include #include std::vector divisors(long long n) { std::vector res; for (long long i = 1; i <= n / i; i++) { if (n % i > 0) { continue; } res.push_back(i); } std::reverse(res.begin(), res.end()); return res; } void solve() { using namespace std; long long n; cin >> n; auto pow = [&](long long x, int k, long long lim) -> long long { long long res = 1; for (int _ = 0; _ < k; _++) { if (res > lim / x) { return -1; } res *= x; } return res; }; vector> ans; // e = 1 for (auto d : divisors(n * 2)) { long long e = n * 2 / d; if ((e - d) % 2 == 0) { continue; } long long l = (e - d - 1) / 2; long long r = l + d; ans.emplace_back(1, l + 1, r); } // e > 1 for (int e = 2; e < 40; e++) { vector acc = {0}; for (long long i = 1; ; i++) { long long p = pow(i, e, n); if (p == -1) { break; } acc.push_back(acc.back() + p); } int sz = acc.size(), r = 0; for (int l = 0; l < sz; l++) { while (r < sz && acc[l] + n > acc[r]) { r++; } if (r < sz && acc[l] + n == acc[r]) { ans.emplace_back(e, l + 1, r); } } } cout << ans.size() << "\n"; for (auto [e, l, r] : ans) { cout << e << " " << l << " " << r << "\n"; } } int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); solve(); }