結果

問題 No.362 門松ナンバー
ユーザー 37zigen37zigen
提出日時 2016-05-26 21:57:13
言語 Java21
(openjdk 21)
結果
WA  
実行時間 -
コード長 2,060 bytes
コンパイル時間 2,368 ms
コンパイル使用メモリ 79,264 KB
実行使用メモリ 42,936 KB
最終ジャッジ日時 2024-04-16 17:40:10
合計ジャッジ時間 6,929 ms
ジャッジサーバーID
(参考情報)
judge1 / judge5
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 165 ms
42,576 KB
testcase_01 WA -
testcase_02 WA -
testcase_03 WA -
testcase_04 WA -
testcase_05 WA -
testcase_06 WA -
testcase_07 WA -
testcase_08 WA -
testcase_09 WA -
testcase_10 WA -
testcase_11 WA -
testcase_12 WA -
testcase_13 WA -
testcase_14 WA -
testcase_15 WA -
testcase_16 WA -
testcase_17 WA -
testcase_18 WA -
testcase_19 WA -
testcase_20 WA -
testcase_21 WA -
権限があれば一括ダウンロードができます

ソースコード

diff #

package yukicoder;
import java.util.Scanner;
public class Main{
	public static void main(String[] args){
		new Main().solve();
	}
	void solve(){
		Scanner sc=new Scanner(System.in);
		int t=sc.nextInt();
		/*
		 *dp[一番左の桁の数][左から一つ右にずれた桁の数][桁数]=門松数の数
		 *leading 0を許す。
		 */
		long[][][] dp=new long[10][10][101];
		for(int i=0;i<10;i++){
			for(int j=0;j<10;j++){
				if(i==j)continue;
				dp[i][j][2]++;
			}
		}

		for(int digit=3;digit<20;digit++){
			for(int i=0;i<10;i++){
				for(int j=0;j<10;j++){
					for(int k=0;k<10;k++){
						if(isKadomatsu(i,j,k)){
							dp[i][j][digit]+=dp[j][k][digit-1];
						}
					}
				}
			}
		}
		//sum[i]:i桁以下の数の数
		//leading 0を許さない
		long[] sum=new long[30];
		for(int digit=3;digit<30;digit++){
			for(int i=1;i<10;i++){
				for(int j=0;j<10;j++){
					sum[digit]+=dp[i][j][digit];
				}
			}
		}

		for(int rep=0;rep<t;rep++){
			long k=sc.nextLong();
			int d=3;
			//k番目の門松数はd桁の数
			for(;;d++){
				if(sum[d]>=k){
					break;
				}
			}
			String ans="";
			long now=k;
			int pre1=-1;
			int pre2=-1;
			//leading 0を許さない。
			out:for(int i=1;i<10;i++){
				for(int j=0;j<10;j++){
					now-=dp[i][j][d];
					//					System.out.println(now+" "+i+" "+j);
					if(now<=0){
						now+=dp[i][j][d];
						ans+=String.valueOf(i)+String.valueOf(j);
						pre1=i;
						pre2=j;
						d-=2;
						break out;
					}
				}
			}
			out2:for(;d>=1;d--){
				if(d==1){
					for(int i=1;i<10;i++){
						if(isKadomatsu(pre1,pre2,i)){
							now--;
							if(now==0){
								ans+=String.valueOf(i);
								break out2;
							}
						}
					}
				}
				for(int i=0;i<9;i++){
					now-=dp[pre2][i][d];
					if(now<=0){
						now+=dp[pre2][i][d];
						ans+=String.valueOf(i);
						pre1=pre2;
						pre2=i;
					}
				}
			}
			System.out.println(ans);
		}
	}
	boolean isKadomatsu(int x,int y,int z){
		if(x==y||y==z||z==x)return false;
		if(x<y&&y>z)return true;
		if(x>y&&y<z)return true;
		return false;
	}
}
0