結果
| 問題 | 
                            No.3316 Make 81181819 with only 0,1,or 8
                             | 
                    
| コンテスト | |
| ユーザー | 
                             msksknkn
                         | 
                    
| 提出日時 | 2025-10-31 23:16:12 | 
| 言語 | Java  (openjdk 23)  | 
                    
| 結果 | 
                             
                                AC
                                 
                             
                            
                         | 
                    
| 実行時間 | 380 ms / 6,000 ms | 
| コード長 | 2,464 bytes | 
| コンパイル時間 | 4,098 ms | 
| コンパイル使用メモリ | 89,972 KB | 
| 実行使用メモリ | 452,644 KB | 
| 最終ジャッジ日時 | 2025-10-31 23:16:26 | 
| 合計ジャッジ時間 | 12,917 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge2 / judge3 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 1 | 
| other | AC * 22 | 
ソースコード
package q1;
import java.util.*;
public class Main {
	public static TreeSet<Integer> 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<Integer,String> 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;
			//int rem = sc.nextInt();
			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++) {
						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;
			boolean minus = false;
			//どうやって復元するのおおおお
			//System.out.println(dp[0][1] + " " + dp[1][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] > dp[pos][i])continue;
					int vd = v + j * 10;
					if(vd < 0)continue;
					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;
				//System.out.println(pos);
			}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);
	}
}
            
            
            
        
            
msksknkn