目录

- #include
- #include
- #include
- #include
- using namespace std;
- int MinSteps(int N, int M)
- {
- vector<int>dp(M + 1, INT_MAX);//表示从出发到石板i的最少步数
- dp[N] = 0;
- for (int i = N; i < M; i++)
- {
- if (dp[i] == INT_MAX)
- {
- continue;
- }
- for (int j = 2; j <= i / 2; j++)
- {
- if (i + j <= M && i % j == 0)
- {
- dp[i + j] = min(dp[i + j], dp[i] + 1);
- }
- }
- }
-
- return dp[M] == INT_MAX ? -1 : dp[M];
- }
- int main()
- {
- int N, M;
- cin >> N >> M;
- cout << MinSteps(N, M);
- return 0;
- }

i 不是质数,那么它的一个约数一定在 sqrt(i) 以下,而另一个约数一定在 sqrt(i) 以上- for (int j = 2; j <= sqrt(i); j++)
- {
- if (i % j == 0 && i + j <= M)
- {
- dp[i + j] = min(dp[i + j], dp[i] + 1);
- }
- if (i % j == 0 && i + i / j <= M)
- {
- dp[i + i / j] = min(dp[i + i / j], dp[i] + 1);
- }
- }
- #include
- #include
- #include
- #include
- using namespace std;
- int MinSteps(int N, int M)
- {
- vector<int>dp(M + 1, INT_MAX);//表示从出发到石板i的最少步数
- dp[N] = 0;
- for (int i = N; i < M; i++)
- {
- if (dp[i] == INT_MAX)
- {
- continue;
- }
- for (int j = 2; j <=sqrt(i); j++)
- {
- if (i % j == 0 && i+j<=M )
- {
- dp[i + j] = min(dp[i + j], dp[i] + 1);
- }
- if(i%j ==0 && i+i/j<=M)
- {
- dp[i + i/j] = min(dp[i + i/j], dp[i] + 1);
- }
- }
- }
-
- return dp[M] == INT_MAX?-1:dp[M];
- }
- int main()
- {
- int N, M;
- cin >> N >> M;
- cout << MinSteps(N, M);
- return 0;
- }