1 条题解

  • 0
    @ 2026-5-16 15:37:58

    题目重述

    给定初始值 xx,目标值 yy,以及操作上限 kk。每次操作可以:

    • 选择 1ak1 \le a \le k,执行 x=x×ax = x \times a
    • 选择 1ak1 \le a \le k,执行 x=x/ax = x / a(必须整除)

    求最少操作次数,若不可能则输出 1-1


    核心思路

    1. 问题分解

    g=gcd(x,y)g = \gcd(x, y),令:

    x=gx,y=gyx = g \cdot x', \quad y = g \cdot y'

    其中 gcd(x,y)=1\gcd(x', y') = 1

    关键观察:由于乘除操作保持数的因子结构,且 gcd(x,y)=1\gcd(x', y') = 1,要使得 xx 变为 yy,必须:

    1. 先将 xx' 通过除法操作变为 11(去除所有与 yy' 不匹配的因子)
    2. 再将 11 通过乘法操作变为 yy'(添加 yy' 所需的因子)

    因此:

    答案=f(x,k)+f(y,k)\text{答案} = f(x', k) + f(y', k)

    其中 f(n,k)f(n, k) 表示将 nn 变为 11 的最少操作次数(只使用除法操作),若不可能则为 1-1

    证明可行性:因为 gcd(x,y)=1\gcd(x', y') = 1xx'yy' 没有公共质因子。任何从 xx'yy' 的路径都必须经过 11,否则无法消去 xx' 独有的因子。而乘法操作只会增加因子,不能直接得到与 xx' 互质的 yy'


    2. 子问题定义

    对于任意正整数 nn,定义:

    $$f(n, k) = \min\{ \text{步数} \mid \text{通过不断除以不超过 } k \text{ 的因子,将 } n \text{ 变为 } 1 \} $$

    为什么只考虑除法?

    • 除法操作能减少数值,符合“化简”的需求
    • 乘法操作只会让数值变大,不利于到达 11
    • 最优策略中,在化简阶段只使用除法,在构造阶段只使用乘法(对称性)

    3. 动态规划求解 f(n,k)f(n, k)

    nn 的所有因子为:

    d1=1<d2<d3<<dm=nd_1 = 1 < d_2 < d_3 < \dots < d_m = n

    定义 dp[i]dp[i] 表示将 did_i 变为 11 的最小操作次数。

    转移方程

    $$dp[i] = \min_{\substack{j < i \\ d_i \bmod d_j = 0 \\ d_i / d_j \le k}} (dp[j] + 1) $$

    解释

    • did_i 出发,除以 a=di/dja = d_i / d_j(必须满足 aka \le kaa 是整数)
    • 一步到达 djd_j
    • 再从 djd_j11 需要 dp[j]dp[j]

    边界条件

    dp[1对应的索引]=0dp[1 \text{对应的索引}] = 0

    最终结果

    $$f(n, k) = dp[m] \quad (\text{若 } dp[m] \text{ 为无穷大,则返回 } -1) $$

    4. 复杂度优化

    如果对 11nn 所有数都做 DP,复杂度为 O(n2)O(n^2),不可接受(n106n \le 10^6)。

    关键优化f(n,k)f(n, k) 只依赖于 nn 的因子,而不需要所有中间数。

    因子个数上界

    • 10610^6 以内的数,最多有约 240240 个因子(例如 720720720720240240 个因子)
    • 一般来说,d(n)=O(n1/3)d(n) = O(n^{1/3})

    因此:

    • 枚举所有因子:O(n)O(\sqrt{n})
    • DP 状态数:d(n)240d(n) \le 240
    • 每次转移枚举 jjO(d(n))O(d(n))
    • 总复杂度:$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 循环优化: 由于因子已排序,di/djd_i / d_jjj 减小而增大。当 di/dj>kd_i / d_j > k 时,更小的 jj 只会使商更大,因此可以提前退出:

    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);
            }
        }
    }
    

    算法步骤总结

    对于每个测试用例 (x,y,k)(x, y, k)

    1. 计算 g=gcd(x,y)g = \gcd(x, y)
    2. x=x/gx' = x / gy=y/gy' = y / g
    3. 计算 a=f(x,k)a = f(x', k)b=f(y,k)b = f(y', k)
    4. a=1a = -1b=1b = -1,输出 1-1;否则输出 a+ba + b

    其中 f(n,k)f(n, k) 的实现:

    • 找出 nn 的所有因子,排序
    • 初始化 dpdp 数组,dp[0]=0dp[0] = 0,其余为一个大数(如 100100
    • 按因子升序进行 DP 转移
    • 返回 dp[last]dp[\text{last}],若仍为大数则返回 1-1

    时间复杂度

    • 每个测试用例:O(max(x,y)+d(x)2+d(y)2)O(\sqrt{\max(x', y')} + d(x')^2 + d(y')^2)
    • x106x' \le 10^6d(n)240d(n) \le 240
    • 最坏情况约 103+2×24021.2×10510^3 + 2 \times 240^2 \approx 1.2 \times 10^5 次操作
    • t104t \le 10^4 但保证 x\sum xy108\sum y \le 10^8,实际总复杂度可接受

    示例验证

    样例 1: x=4,y=6,k=3x=4, y=6, k=3

    • g=gcd(4,6)=2g = \gcd(4,6) = 2
    • x=2,y=3x' = 2, y' = 3
    • f(2,3)f(2,3):因子 [1,2][1,2]dp[1]=dp[0]+1=1dp[1]=dp[0]+1=1
    • f(3,3)f(3,3):因子 [1,3][1,3]dp[1]=1dp[1]=1
    • 答案 =1+1=2= 1+1 = 2

    样例 2: x=4,y=5,k=3x=4, y=5, k=3

    • g=1g = 1
    • x=4,y=5x' = 4, y' = 5
    • f(4,3)f(4,3):因子 [1,2,4][1,2,4],可从 4214 \to 2 \to 1,需要 22
    • f(5,3)f(5,3):因子 [1,5][1,5]55 无法除以 3\le 3 的因子(除了 11),无法到达 11,返回 1-1
    • 答案 1-1

    样例 4: x=10,y=45,k=3x=10, y=45, k=3

    • g=gcd(10,45)=5g = \gcd(10,45) = 5
    • x=2,y=9x' = 2, y' = 9
    • f(2,3)=1f(2,3) = 1212 \to 1,除以 22
    • f(9,3)f(9,3):因子 [1,3,9][1,3,9]9319 \to 3 \to 1,需要 22
    • 答案 =1+2=3= 1+2 = 3

    正确性证明

    1. 必要性:由于 gcd(x,y)=1\gcd(x', y') = 1,任何从 xx'yy' 的路径必须消去 xx' 的所有质因子(否则无法与 yy' 互质),因此必须经过 11
    2. 最优性:在化简阶段,除法操作是最有效的减少方法;在构造阶段,乘法操作是最有效的增加方法。由于操作可逆且步数对称,分别计算再相加得到最优解。
    3. 可行性f(n,k)f(n, k) 的 DP 正确计算了最少除法步数,因为每一步只能除以不超过 kk 的因子,且 DP 枚举了所有可能的中间状态(nn 的所有因子)。

    注意事项

    1. 边界情况:当 x=yx = y 时,g=xg = xx=y=1x' = y' = 1f(1,k)=0f(1,k)=0,答案为 00
    2. 无解情况:若 xx'yy' 有大于 kk 的质因子且该质因子的幂次无法通过多次除法消除,则无解。
    3. 整除判断:注意 dimoddj=0d_i \bmod d_j = 0 的条件,确保除法操作合法。
    4. 循环顺序:第二层循环从大到小遍历并提前退出,利用了因子排序的单调性。
    • 1

    信息

    ID
    7114
    时间
    1000ms
    内存
    256MiB
    难度
    5
    标签
    递交数
    2
    已通过
    1
    上传者