1 条题解

  • 0
    @ 2026-4-3 22:54:54

    题目回顾

    A. 枫树与乘法
    每次测试时间限制:11
    每次测试内存限制:256256 兆字节

    枫树有两个正整数 aabb。她可以执行任意多次(可能为零次)如下操作,使得 aa 等于 bb

    • 选择任意正整数 xx,并将 aabb 乘以 xx

    求最少操作次数。可以证明答案总是存在。

    输入:tt 个测试用例,每个用例一行两个整数 a,ba, b1a,b10001 \le a, b \le 1000)。
    输出:每个用例一行,最少操作次数。


    题解

    情况一:a=ba = b

    此时两数已经相等,不需要任何操作。

    答案=0\text{答案} = 0

    情况二:一个数能被另一个数整除

    假设 aa 能被 bb 整除,即 amodb=0a \bmod b = 0
    那么我们可以选择 x=abx = \frac{a}{b},将 bb 乘以 xx,得到:

    b×ab=ab \times \frac{a}{b} = a

    一次操作后 bb 变为 aa,两数相等。
    同理,如果 bb 能被 aa 整除,一次操作将 aa 乘以 ba\frac{b}{a} 即可。

    因此:

    $$\text{答案} = 1 \quad \text{当} \quad a \mid b \ \text{或} \ b \mid a \ \text{且} \ a \ne b $$

    其中 aba \mid b 表示 aa 整除 bb


    情况三:其他情况(互不整除)

    此时一次操作无法完成,因为:

    • 若只动 aa 使其等于 bb,需要 b/ab/a 为整数,但 aba \nmid b
    • 若只动 bb 使其等于 aa,需要 a/ba/b 为整数,但 bab \nmid a

    但是两次操作总是可行的。
    我们取 m=a×bm = a \times b,然后:

    1. aa 乘以 bb,得到 a×ba \times b
    2. bb 乘以 aa,得到 a×ba \times b

    两次操作后,两个数都等于 a×ba \times b

    因此:

    $$\text{答案} = 2 \quad \text{当} \quad a \nmid b \ \text{且} \ b \nmid a $$

    最终分段函数

    综合以上三种情况:

    $$\boxed{ \text{答案} = \begin{cases} 0, & a = b \\[4pt] 1, & a \mid b \ \text{或} \ b \mid a \ \text{且} \ a \ne b \\[4pt] 2, & \text{否则} \end{cases} } $$

    复杂度分析

    每个测试用例只需进行 O(1)O(1) 次整除判断,总时间复杂度 O(t)O(t),空间复杂度 O(1)O(1),完全满足 t100t \le 100 的限制。


    代码实现(C++)

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    
    int solve() {
        int a, b;
        cin >> a >> b;
        if (a == b) return 0;
        if (a % b == 0 || b % a == 0) return 1;
        return 2;
    }
    
    int main() {
        ios::sync_with_stdio(false);
        int TC;
        cin >> TC;
        while (TC--) {
            cout << solve() << '\n';
        }
        return 0;
    }
    

    示例验证

    输入:

    3
    1 2
    10 3
    1000 1000
    
    • a=1,b=2a=1, b=222 能被 11 整除?不,是 11 能被 22 整除?否。但 2mod1=02 \bmod 1 = 0 吗?注意判断条件 a % b == 0 || b % a == 0
      1%2=101 \% 2 = 1 \ne 02%1=02 \% 1 = 0,成立 → 输出 11
    • a=10,b=3a=10, b=310%3=110 \% 3 = 13%10=33 \% 10 = 3,都不为 00 → 输出 22
    • a=1000,b=1000a=1000, b=1000:相等 → 输出 00

    输出:

    1
    2
    0
    

    与题目示例完全一致。

    • 1

    信息

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