#include <bits/stdc++.h>
using namespace std;
#define int long long
#define nn "\n"
const int INF = 1e18;
const int mod = 1e9+7;
const int N = 100000 + 5;
int x;
int dp[N]; // số cách
int f[N]; // số lượng min
int trace[N]; // truy vết
vector<int> c;
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> x;
// sinh các số chính phương
for (int i = 1; i * i <= x; i++) {
c.push_back(i * i);
}
// khởi tạo
dp[0] = 1;
for (int i = 1; i <= x; i++) {
f[i] = INF;
}
// DP
for (int i = 1; i <= x; i++) {
for (int k : c) {
if (k > i) break;
// đếm số cách
dp[i] = (dp[i] + dp[i - k]) % mod;
// tối ưu số lượng + truy vết
if (f[i] > f[i - k] + 1) {
f[i] = f[i - k] + 1;
trace[i] = k;
}
}
}
cout << dp[x] << " " << f[x] << nn;
// truy vết
vector<int> ans;
int cur = x;
while (cur > 0) {
ans.push_back(trace[cur]);
cur -= trace[cur];
}
// in các số chính phương dùng
for (int v : ans) cout << v << " ";
cout << nn;
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIGludCBsb25nIGxvbmcKI2RlZmluZSBubiAiXG4iCmNvbnN0IGludCBJTkYgPSAxZTE4Owpjb25zdCBpbnQgbW9kID0gMWU5Kzc7CmNvbnN0IGludCBOID0gMTAwMDAwICsgNTsKCmludCB4OwppbnQgZHBbTl07ICAgICAgICAvLyBz4buRIGPDoWNoCmludCBmW05dOyAgICAgICAgIC8vIHPhu5EgbMaw4bujbmcgbWluCmludCB0cmFjZVtOXTsgICAgIC8vIHRydXkgduG6v3QKdmVjdG9yPGludD4gYzsKCnNpZ25lZCBtYWluKCkgewogICAgaW9zOjpzeW5jX3dpdGhfc3RkaW8oMCk7CiAgICBjaW4udGllKDApOwoKICAgIGNpbiA+PiB4OwoKICAgIC8vIHNpbmggY8OhYyBz4buRIGNow61uaCBwaMawxqFuZwogICAgZm9yIChpbnQgaSA9IDE7IGkgKiBpIDw9IHg7IGkrKykgewogICAgICAgIGMucHVzaF9iYWNrKGkgKiBpKTsKICAgIH0KCiAgICAvLyBraOG7n2kgdOG6oW8KICAgIGRwWzBdID0gMTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IHg7IGkrKykgewogICAgICAgIGZbaV0gPSBJTkY7CiAgICB9CgogICAgLy8gRFAKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IHg7IGkrKykgewogICAgICAgIGZvciAoaW50IGsgOiBjKSB7CiAgICAgICAgICAgIGlmIChrID4gaSkgYnJlYWs7CgogICAgICAgICAgICAvLyDEkeG6v20gc+G7kSBjw6FjaAogICAgICAgICAgICBkcFtpXSA9IChkcFtpXSArIGRwW2kgLSBrXSkgJSBtb2Q7CgogICAgICAgICAgICAvLyB04buRaSDGsHUgc+G7kSBsxrDhu6NuZyArIHRydXkgduG6v3QKICAgICAgICAgICAgaWYgKGZbaV0gPiBmW2kgLSBrXSArIDEpIHsKICAgICAgICAgICAgICAgIGZbaV0gPSBmW2kgLSBrXSArIDE7CiAgICAgICAgICAgICAgICB0cmFjZVtpXSA9IGs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgY291dCA8PCBkcFt4XSA8PCAiICIgPDwgZlt4XSA8PCBubjsKCiAgICAvLyB0cnV5IHbhur90CiAgICB2ZWN0b3I8aW50PiBhbnM7CiAgICBpbnQgY3VyID0geDsKICAgIHdoaWxlIChjdXIgPiAwKSB7CiAgICAgICAgYW5zLnB1c2hfYmFjayh0cmFjZVtjdXJdKTsKICAgICAgICBjdXIgLT0gdHJhY2VbY3VyXTsKICAgIH0KCiAgICAvLyBpbiBjw6FjIHPhu5EgY2jDrW5oIHBoxrDGoW5nIGTDuW5nCiAgICBmb3IgKGludCB2IDogYW5zKSBjb3V0IDw8IHYgPDwgIiAiOwogICAgY291dCA8PCBubjsKCiAgICByZXR1cm4gMDsKfQo=