// #pragma GCC target("avx2,bmi2,popcnt,lzcnt") // #pragma GCC optimize("O3,unroll-loops") #include // #include using namespace std; using namespace numbers; #ifdef LOCAL #include "Debug.h" #else #define debug_endl() 42 #define debug(...) 42 #define debug2(...) 42 #define debug_bin(...) 42 #endif // Returns the largest integer k with x >= k * y template T floor_div(T x, U y){ assert(y > 0); return x / y - (x % y < 0); } // Returns the smallest integer k with x <= k * y template T ceil_div(T x, U y){ assert(y > 0); return x / y + (x % y > 0); } template T &ctmin(T &x){ return x; } template T &ctmin(T &x, const Head &h, const Tail &... t){ return ctmin(x = min(x, h), t...); } template T &ctmax(T &x){ return x; } template T &ctmax(T &x, const Head &h, const Tail &... t){ return ctmax(x = max(x, h), t...); } int main(){ cin.tie(0)->sync_with_stdio(0); cin.exceptions(ios::badbit | ios::failbit); const int mx = 81181819; vector pow{1}; while((int)pow.size() < 9){ pow.push_back(pow.back() * 10); } const int inf = numeric_limits::max() / 2; vector dp(mx, inf); vector> last(mx, {-1, -1}); dp[0] = 0; for(auto s = 1; s < mx; ++ s){ for(auto use8 = 0; use8 <= 6; ++ use8){ for(auto use1 = 0; use1 <= 7 - use8; ++ use1){ if(auto x = use1 + 8 * use8; x <= s && (s - x) % 10 == 0 && dp[s] > max(dp[(s - x) / 10], use1 + use8)){ dp[s] = max(dp[(s - x) / 10], use1 + use8); last[s] = {use1, use8}; } } } } auto solve_testcase = [&](auto testcase_id)->int{ int s; cin >> s, s = mx - s; vector res(dp[s]); for(auto d = 0; s > 0; ++ d){ assert(d < 8); auto [use1, use8] = last[s]; s = (s - use1 - 8 * use8) / 10; for(auto i = 0; i < use8; ++ i){ res[i] += 8 * pow[d]; } for(auto i = use8; i < use1 + use8; ++ i){ res[i] += pow[d]; } } cout << (int)res.size() << "\n"; ranges::copy(res, ostream_iterator(cout, "\n")); return 0; }; int testcase_count; cin >> testcase_count; for(auto testcase_id = 0; testcase_id < testcase_count; ++ testcase_id){ solve_testcase(testcase_id); } return 0; } /* 1 1 1 1 1 1 1 8 8 8 8 8 8 */