import std; void main () { long S = readln.chomp.to!long; solve(S); } void solve (long S) { long[] ans; ans.reserve(15); while (0 < S) { long A = findA(S); S -= A; ans ~= A; } // output writeln(ans.length); foreach (i, a; ans) { write(a, (i == ans.length-1 ? '\n' : ' ')); } } /* return: S以下で最も近い平方数を返す。O(log(S)) */ long findA (long S) { assert(1 <= S); bool f (long x) { return x*x <= S; } long ok = 1, ng = 2*10^^9; while (1 < abs(ok-ng)) { long mid = (ok+ng)/2; if (f(mid)) { ok = mid; } else { ng = mid; } } return ok*ok; }