小易来到了一条石板路前,每块石板上从1挨着编号为:1、2、3…….
这条石板路要根据特殊的规则才能前进:对于小易当前所在的编号为K的 石板,小易单次只能往前跳K的一个约数(不含1和K)步,即跳到K+X(X为K的一个非1和本身的约数)的位置。 小易当前处在编号为N的石板,他想跳到编号恰好为M的石板去,小易想知道最少需要跳跃几次可以到达。
例如:
N = 4,M = 24:
4->6->8->12->18->24
于是小易最少需要跳跃5次,就可以从4号石板跳到24号石板
输入描述:
输入为一行,有两个整数N,M,以空格隔开。
(4 ≤ N ≤ 100000)
(N ≤ M ≤ 100000)
输出描述:
输出小易最少需要跳跃的步数,如果不能到达输出-1
输入例子1:
4 24
输出例子1:
5
解题思路
假如当前处于i步,j为i的所有约数。
那么
dp[i+j]=min(dp[i+j],dp[i]+1)
求约数的时候需要进行优化,不然AC不起。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int M = sc.nextInt();
int[] dp = new int[M + 1];
dp[N] = 1;
for (int i = N; i < dp.length; i++) {
if (dp[i] == 0)
continue;
double temp = Math.sqrt(i);
for (int j = 2; j <= temp; j++) {
if (i % j == 0) {
if (i + j <= M) {
if (i % j == 0) {
if (dp[i + j] == 0)
dp[i + j] = dp[i] + 1;
else
dp[i + j] = Math.min(dp[i + j], dp[i] + 1);
}
}
int b = i / j;
if (i + b <= M) {
if (dp[i + b] == 0)
dp[i + b] = dp[i] + 1;
else
dp[i + b] = Math.min(dp[i + b], dp[i] + 1);
}
}
}
}
System.out.println(dp[M] - 1);
}
}