AOJ2424 Kakezan
問題リンク Kakezan
- 解法
数xが次にどこに遷移するのかを最初に全部求めておきます。
xがxより大きい数に遷移することはなさそうだなー(勘)ということで、遷移を求める範囲は10^6までで十分です。
無限回の判定は、xを遷移させていって、同じ数に戻った時なのでそれを検出すればOKです。
- ソース
import java.util.Arrays; import java.util.Scanner; //Kakezan public class AOJ2424 { void run(){ int[] f = new int[1000001]; for(int x=0;x<=1000000;x++){ int max = 0; for(int d=10;d<=1000000;d*=10){ max = Math.max(max, (x/d)*(x%d)); } f[x] = max; } Scanner sc = new Scanner(System.in); boolean[] u = new boolean[1000001]; int Q = sc.nextInt(); while(Q--!=0){ Arrays.fill(u, false); int x = sc.nextInt(), res = 0; u[x] = true; while(10<=x){ x = f[x]; if(u[x]){ res = -1; break; } res++; u[x] = true; } System.out.println(res); } } public static void main(String[] args) { new AOJ2424().run(); } }