#include // #include using namespace std; using namespace numbers; // Find floor(n^1/k) for non-negative integers n, k struct floored_root{ vector pow[65]; floored_root(){ for(auto t = 2u; t < 1 << 16; ++ t){ unsigned long long s = t * t; s = s * s; for(auto k = 4; ; ++ k){ pow[k].push_back(s); if(__builtin_umulll_overflow(s, t, &s)) break; } } } unsigned long long sqrt(unsigned long long n) const{ if(n == -1ull) return (unsigned int)-1; unsigned long long x = std::sqrt(n); return x * x > n ? x - 1 : x; } unsigned long long cbrt(unsigned long long n) const{ unsigned long long x = 0, y = 0; for(auto s = 63; s >= 0; s -= 3){ x <<= 1; y = 3 * x * (x + 1) + 1; if(y <= (n >> s)) n -= y << s, ++ x; } return x; } unsigned long long operator()(unsigned long long n, int k) const{ assert(1 <= k && k <= 64); if(k == 1 || n == 0) return n; if(k == 2) return sqrt(n); if(k == 3) return cbrt(n); return upper_bound(pow[k].begin(), pow[k].end(), n) - pow[k].begin() + 1; } } F; int main(){ cin.tie(0)->sync_with_stdio(0); cin.exceptions(ios::badbit | ios::failbit); long long s; cin >> s; vector a; while(s){ a.push_back(F.sqrt(s)); a.back() *= a.back(); s -= a.back(); } cout << (int)a.size() << "\n"; ranges::copy(a, ostream_iterator(cout, " ")); cout << "\n"; return 0; } /* */ //////////////////////////////////////////////////////////////////////////////////////// // // // Coded by Aeren // // // ////////////////////////////////////////////////////////////////////////////////////////