package q1; import java.util.*; public class Main { public static TreeSet set = new TreeSet<>(); public static int iwai = 81181819; public static int[] ans = new int[iwai + 1]; public static boolean[] vis = new boolean[iwai]; public static HashMap map = new HashMap<>(); public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ Scanner sc = new Scanner(System.in); int t = sc.nextInt(); make(0); StringBuilder sb = new StringBuilder(); for(int c = 0;c < t;c++) { int n = sc.nextInt(); int rem = iwai - n; StringBuilder a = new StringBuilder(); String s = Integer.toString(rem); //前からi桁目まで見て、直前の桁の値が0 ~ 7のいずれか処理してあるorしてなくて各桁で使う数の上限の最小値? int[][] dp = new int[8][s.length() + 1]; for(int i = 0;i < 8;i++) { for(int j = 0;j <= s.length();j++) { dp[i][j] = 181; } } dp[0][0] = 0; for(int i = 1;i <= s.length();i++) { int p = s.charAt(i - 1) - '0'; for(int j = 0;j < 8;j++) { int sum = j * 10 + p; int num = sum / 8; int q = sum % 8; //1を使う個数 for(int k = 0;k <= q;k++) { if(i != n || q - k == 0) dp[q - k][i] = Math.min(dp[q - k][i], Math.max(dp[j][i - 1],num + k)); //System.out.println(q + " " + k +" " + i + " " + dp[q - k][i]); } } }//System.out.println(dp[0][s.length()]); int ans = dp[0][s.length()]; int[] list = new int[ans]; int pos = 0; int add = 1; //どうやって復元するのおおおお for(int i = s.length();i >= 1;i--) { int v = s.charAt(i - 1) - '0' - pos; for(int j = 0;j < 8;j++) { if(dp[j][i - 1] > ans)continue; int vd = v + j * 10; int div8 = vd / 8; int one = vd % 8; if(div8 + one <= ans) { for(int k = 0;k < div8;k++) { list[k] += 8 * add; }for(int k = 0;k < one;k++) { list[k + div8] += add; }pos = j; break; } }add *= 10; }for(int i = 0;i < ans;i++) { a.append(list[i] + "\n"); } sb.append(ans + "\n" + a); } System.out.print(sb); }public static void make(int a) { if(a > iwai) { return; } if(a != 0) { set.add(a); make(a * 10); }make(a * 10 + 1); make(a * 10 + 8); } }