1 条题解

  • 0
    @ 2026-4-2 23:03:09

    题目题解

    问题理解

    机器人从 (a,b)(a, b) 出发,每次可以选择 dx,dy[0,k]dx, dy \in [0, k],移动到 (xdx,ydy)(x - dx, y - dy)
    使用新的 (dx,dy)(dx, dy) 成本为 11,重复使用成本为 00
    求到达 (0,0)(0, 0) 的最小总成本。


    第一步:平凡上界

    总是可以使用操作 (0,1)(0, 1) 重复 bb 次,以及操作 (1,0)(1, 0) 重复 aa 次。
    这两组操作各首次使用时成本 11,后续重复成本 00
    因此总成本 2\le 2

    所以答案只可能是 1122


    第二步:何时成本为 11

    成本为 11 意味着只使用一种 (dx,dy)(dx, dy) 对,重复若干次(可能一次)。
    设使用 tt 次操作,则:

    a=tdx,b=tdy.a = t \cdot dx, \quad b = t \cdot dy.

    因此 tt 必须是 aabb 的公因数,且:

    $$dx = \frac{a}{t} \le k, \quad dy = \frac{b}{t} \le k. $$

    要存在这样的 tt,等价于存在一个公因数 tt 使得 atk\frac{a}{t} \le kbtk\frac{b}{t} \le k


    第三步:最大化 tt

    条件等价于:

    $$t \ge \frac{a}{k} \quad \text{且} \quad t \ge \frac{b}{k}. $$

    因此 tt 至少为 $\max\left(\left\lceil \frac{a}{k} \right\rceil, \left\lceil \frac{b}{k} \right\rceil\right)$。
    同时 tt 必须是 aabb 的公因数。

    显然,选择最大的可能 tt(即 g=gcd(a,b)g = \gcd(a, b))最有可能满足条件。
    因为若存在某个 tt 满足条件,则 ggtt 的倍数,agatk\frac{a}{g} \le \frac{a}{t} \le k 也成立。
    所以只需检查 gg 即可。


    第四步:判断条件

    计算 g=gcd(a,b)g = \gcd(a, b)

    $$\frac{a}{g} \le k \quad \text{且} \quad \frac{b}{g} \le k, $$

    则可以用 (a/g,b/g)(a/g, b/g) 重复 gg 次,成本为 11
    否则成本为 22


    第五步:时间复杂度

    • 计算 gcd\gcdO(logmin(a,b))O(\log \min(a, b))
    • 总复杂度 O(tlogmax(a,b))O(t \log \max(a, b)),满足 t104t \le 10^4a,b1018a,b \le 10^{18}

    代码实现

    #include <bits/stdc++.h>
    using namespace std;
    
    using ll = long long;
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        
        int t;
        cin >> t;
        while (t--) {
            ll a, b, k;
            cin >> a >> b >> k;
            
            // 使用 __gcd 或 std::gcd
            ll g = __gcd(a, b);  // GCC 内置函数,兼容性好
            // 或者使用 std::gcd 需要 C++17 和 <numeric>
            // ll g = gcd(a, b);
            
            if (a / g <= k && b / g <= k) {
                cout << "1\n";
            } else {
                cout << "2\n";
            }
        }
        
        return 0;
    }
    

    验证样例

    输入:

    4
    3 5 15
    2 3 1
    12 18 8
    9 7 5
    

    输出:

    1
    2
    1
    2
    

    与题目输出一致。


    总结

    本题的关键在于:

    1. 观察到答案不超过 22
    2. 成本为 11 当且仅当 gcd(a,b)\gcd(a, b) 对应的操作步长不超过 kk
    3. 只需检查 gcd(a,b)\gcd(a, b) 即可,无需枚举所有公因数。
    • 1

    信息

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