using System; using static System.Console; using System.Linq; using System.Collections.Generic; using System.Globalization; class Program { static long NN => long.Parse(ReadLine()); public static void Main() { Solve(); } static void Solve() { var n = NN; var ans = new List<(int e, long l, long r)>(); // E=1 : R=L+aとすると a(a+2L+1) = 2N var p = PList(2 * n); foreach (var a in p) { var b = 2 * n / a; if (a >= b) break; var l2 = b - a - 1; if (l2 > 0 && l2 % 2 == 0) { ans.Add((1, l2 / 2 + 1, l2 / 2 + a)); } } // E>1 for (var e = 2; e <= 40; ++e) { var cum = new List(); cum.Add(0); var j = 0; for (var i = 1; i <= 1_000_000; ++i) { var m = (long)Math.Pow(i, e); if (m > n) break; cum.Add(cum[^1] + m); while (j < i && cum[i] - cum[j] > n) ++j; if (cum[i] - cum[j] == n) ans.Add((e, j + 1, i)); } } ans.Sort((l, r) => { var d = l.e.CompareTo(r.e); if (d != 0) return d; d = l.l.CompareTo(r.l); if (d != 0) return d; return l.r.CompareTo(r.r); }); WriteLine(ans.Count); if (ans.Count > 0) WriteLine(string.Join("\n", ans.Select(ai => $"{ai.e} {ai.l} {ai.r}"))); } static List PList(long a) { var ans = new List(); var rev = new List(); for (var i = 1L; i * i <= a; ++i) { if (a % i == 0) { ans.Add(i); if (i * i < a) rev.Add(a / i); } } rev.Reverse(); return ans.Concat(rev).ToList(); } }