// ideone.com/ysdd6b
#include <iostream>
#include <algorithm>
#include <cmath>
#include <functional>
#include <numeric>
#include <vector>
#include <boost/multiprecision/cpp_int.hpp>
using namespace std;
using BigInt = boost::multiprecision::int128_t;
const int N = 36;
const int W = N * (1 - 1 / log10(16)) + 1;
BigInt a[N], d[N], h[N], ax[N][10], smin[N][10], smax[N][10];
int x[N], q, w;
vector<BigInt> X;
BigInt toBigInt()
{
return inner_product(x, x + N, d, (BigInt)0);
}
void solve(int p = 0, BigInt s = 0, int t = 0)
{
int i, j;
bool isExtraEnd = w == 0 && p == q - 1;
if (a[p] >= 0) {
i = lower_bound(smax[p], smax[p] + 10, s) - smax[p];
j = upper_bound(smin[p], smin[p] + 10, s) - smin[p];
} else {
i = lower_bound(smin[p], smin[p] + 10, s, greater<BigInt>()) - smin[p];
j = upper_bound(smax[p], smax[p] + 10, s, greater<BigInt>()) - smax[p];
}
for (x[p] = i; x[p] < j; x[p]++) {
if (isExtraEnd && (t + x[p]) % 3) continue;
if (p == N - 1) {
X.push_back(toBigInt());
} else {
solve(p + 1, s - ax[p][x[p]], t + x[p]);
}
}
}
int main(void)
{
int i, j;
for (i = N - 1; i >= 0; i--) {
d[i] = i + 1 < N ? 10 * d[i + 1] : (BigInt)1;
h[i] = i + 1 < N ? 16 * h[i + 1] : (BigInt)1;
}
for (w = 0; w <= W; w++) {
for (i = 0; i < N; i++) a[i] = (i + w < N ? h[i + w] : 0) - d[i];
for (i = 0; i < N; i++) for (j = 0; j < 10; j++) ax[i][j] = a[i] * j;
for (i = N - 1; i >= 0; i--) {
for (j = 0; j < 10; j++) {
if (a[i + 1] >= 0) {
smin[i][j] = (i + 1 < N ? smin[i + 1][0] : 0) + ax[i][j];
smax[i][j] = (i + 1 < N ? smax[i + 1][9] : 0) + ax[i][j];
} else {
smin[i][j] = (i + 1 < N ? smin[i + 1][9] : 0) + ax[i][j];
smax[i][j] = (i + 1 < N ? smax[i + 1][0] : 0) + ax[i][j];
}
}
}
for (q = 0; q < N; q++) {
if (q > 0) {
a[q - 1] = -d[q - 1];
for (j = 0; j < 10; j++) ax[q - 1][j] = a[q - 1] * j;
for (i = q - 1; i >= 0; i--) {
for (j = 0; j < 10; j++) {
if (a[i + 1] >= 0) {
smin[i][j] = smin[i + 1][0] + ax[i][j];
smax[i][j] = smax[i + 1][9] + ax[i][j];
} else {
smin[i][j] = smin[i + 1][9] + ax[i][j];
smax[i][j] = smax[i + 1][0] + ax[i][j];
}
}
}
}
solve();
}
}
sort(X.begin(), X.end());
X.erase(unique(X.begin(), X.end()), X.end());
for (auto x : X) cout << x << endl;
cout << endl << X.size() << endl;
return 0;
}