1 条题解
-
0
题目重述
给定初始值 ,目标值 ,以及操作上限 。每次操作可以:
- 选择 ,执行
- 选择 ,执行 (必须整除)
求最少操作次数,若不可能则输出 。
核心思路
1. 问题分解
设 ,令:
其中 。
关键观察:由于乘除操作保持数的因子结构,且 ,要使得 变为 ,必须:
- 先将 通过除法操作变为 (去除所有与 不匹配的因子)
- 再将 通过乘法操作变为 (添加 所需的因子)
因此:
其中 表示将 变为 的最少操作次数(只使用除法操作),若不可能则为 。
证明可行性:因为 , 和 没有公共质因子。任何从 到 的路径都必须经过 ,否则无法消去 独有的因子。而乘法操作只会增加因子,不能直接得到与 互质的 。
2. 子问题定义
对于任意正整数 ,定义:
$$f(n, k) = \min\{ \text{步数} \mid \text{通过不断除以不超过 } k \text{ 的因子,将 } n \text{ 变为 } 1 \} $$为什么只考虑除法?
- 除法操作能减少数值,符合“化简”的需求
- 乘法操作只会让数值变大,不利于到达
- 最优策略中,在化简阶段只使用除法,在构造阶段只使用乘法(对称性)
3. 动态规划求解
设 的所有因子为:
定义 表示将 变为 的最小操作次数。
转移方程:
$$dp[i] = \min_{\substack{j < i \\ d_i \bmod d_j = 0 \\ d_i / d_j \le k}} (dp[j] + 1) $$解释:
- 从 出发,除以 (必须满足 且 是整数)
- 一步到达
- 再从 到 需要 步
边界条件:
最终结果:
$$f(n, k) = dp[m] \quad (\text{若 } dp[m] \text{ 为无穷大,则返回 } -1) $$
4. 复杂度优化
如果对 到 所有数都做 DP,复杂度为 ,不可接受()。
关键优化: 只依赖于 的因子,而不需要所有中间数。
因子个数上界:
- 以内的数,最多有约 个因子(例如 有 个因子)
- 一般来说,
因此:
- 枚举所有因子:
- DP 状态数:
- 每次转移枚举 :
- 总复杂度:$O(\sqrt{n} + d(n)^2) \approx O(10^3 + 240^2) \approx 6 \times 10^4$,完全可行
实现细节:
// 枚举 n 的所有因子 for (int i = 1; i * i <= n; i++) { if (n % i == 0) { divs.push_back(i); if (i != n / i) divs.push_back(n / i); } } sort(divs.begin(), divs.end());DP 循环优化: 由于因子已排序, 随 减小而增大。当 时,更小的 只会使商更大,因此可以提前退出:
for (int i = 1; i < n; i++) { for (int j = i - 1; j >= 0; j--) { if (divs[i] / divs[j] > k) break; // 提前退出 if (divs[i] % divs[j] == 0) { dp[i] = min(dp[i], dp[j] + 1); } } }
算法步骤总结
对于每个测试用例 :
- 计算
- 令 ,
- 计算 ,
- 若 或 ,输出 ;否则输出
其中 的实现:
- 找出 的所有因子,排序
- 初始化 数组,,其余为一个大数(如 )
- 按因子升序进行 DP 转移
- 返回 ,若仍为大数则返回
时间复杂度
- 每个测试用例:
- ,
- 最坏情况约 次操作
- 但保证 和 ,实际总复杂度可接受
示例验证
样例 1:
- :因子 ,
- :因子 ,
- 答案
样例 2:
- :因子 ,可从 ,需要 步
- :因子 , 无法除以 的因子(除了 ),无法到达 ,返回
- 答案
样例 4:
- (,除以 )
- :因子 ,,需要 步
- 答案
正确性证明
- 必要性:由于 ,任何从 到 的路径必须消去 的所有质因子(否则无法与 互质),因此必须经过 。
- 最优性:在化简阶段,除法操作是最有效的减少方法;在构造阶段,乘法操作是最有效的增加方法。由于操作可逆且步数对称,分别计算再相加得到最优解。
- 可行性: 的 DP 正确计算了最少除法步数,因为每一步只能除以不超过 的因子,且 DP 枚举了所有可能的中间状态( 的所有因子)。
注意事项
- 边界情况:当 时,,,,答案为 。
- 无解情况:若 或 有大于 的质因子且该质因子的幂次无法通过多次除法消除,则无解。
- 整除判断:注意 的条件,确保除法操作合法。
- 循环顺序:第二层循环从大到小遍历并提前退出,利用了因子排序的单调性。
- 1
信息
- ID
- 7114
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 5
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者