1 条题解

  • 0
    @ 2026-5-14 20:02:42

    好的,这里是一个详略适中的题解版本:


    题意

    (0,0)(0,0) 走到 (x,y)(x,y)x,y1x,y \ge 1

    移动规则:

    • 1,3,5,1,3,5,\dots(奇数)步必须沿 xx 轴方向
    • 2,4,6,2,4,6,\dots(偶数)步必须沿 yy 轴方向
    • 每一步移动的距离是正整数,且严格大于上一步的距离
    • 可以沿正方向或负方向移动(但为了到达正坐标,通常只考虑正方向)

    最少步数,若不可能则输出 1-1


    关键观察

    设步数为 kk

    • kk 为偶数,k=2mk=2m
      xxmm 个奇数步的代数和得到
      yymm 个偶数步的代数和得到

    • kk 为奇数,k=2m+1k=2m+1
      xxm+1m+1 个奇数步的代数和得到
      yymm 个偶数步的代数和得到

    由于步长严格递增,最小的 mm 个奇数步之和为 1+3++(2m1)=m21+3+\dots+(2m-1)=m^2
    最小的 mm 个偶数步之和为 2+4++2m=m(m+1)2+4+\dots+2m=m(m+1)


    可行性分析

    情况1:k=2k=2(两步)

    • 第一步(xx 方向)走 aa,第二步(yy 方向)走 bb,且 b>a1b > a \ge 1
    • 到达 (a,b)(a, b),所以 x=ax=ay=by=b
    • 条件:x<yx < yx1x \ge 1

    结论x<yx < y 时两步可达,步数为 22


    情况2:k=3k=3(三步)

    • 步长 a<b<ca < b < ca,ca,c 沿 xx 轴,bb 沿 yy
    • 到达 (a+c, b)(a+c,\ b),即 x=a+cx=a+cy=by=b
    • 需要存在正整数 a,b,ca,b,c 满足 a<b<ca < b < ca+c=xa+c=xb=yb=y

    构造方法:取 a=1a=1b=yb=y,则需 c=x1c=x-1 且满足 1<y<x11 < y < x-1
    y2y \ge 2xy+2x \ge y+2

    结论y2y \ge 2xy+2x \ge y+2 时三步可达,步数为 33


    情况3:k=1k=1(一步)

    • 第一步沿 xx 轴,只能到达 (x,0)(x,0),但 y1y \ge 1,所以不可能

    情况4:k4k \ge 4

    • k=2k=2k=3k=3 都不满足时,能否用更多步数实现?
    • 可以证明(通过分析最小和与递增限制):若 k=2k=2k=3k=3 均不可行,则任何 k4k \ge 4 也不可行
    • 原因:当 xyx \ge y 且不满足 k=3k=3 条件时,xxyy 都太小,无法分配递增步长

    特殊情况(1,1)(1,1)

    • k=2k=2 需要 x<yx<y,不满足
    • k=3k=3 需要 y2y \ge 2,不满足
    • 任何更多步数,第一步至少 11,第二步至少 22,第三步至少 33xx 至少 1+3=4>11+3=4>1,不可能
      → 输出 1-1

    最终结论

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

    1. x=1x=1y=1y=1,输出 1-1
    2. 否则若 x<yx < y,输出 22
    3. 否则若 y2y \ge 2xy+2x \ge y+2,输出 33
    4. 否则输出 1-1

    时间复杂度

    O(t)O(t),每个测试用例 O(1)O(1) 判断。


    C++ 代码

    #include <iostream>
    using namespace std;
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        
        int t;
        cin >> t;
        
        while (t--) {
            long long x, y;
            cin >> x >> y;
            
            if (x == 1 && y == 1) {
                cout << "-1\n";
            } else if (x < y) {
                cout << "2\n";
            } else if (y >= 2 && x >= y + 2) {
                cout << "3\n";
            } else {
                cout << "-1\n";
            }
        }
        
        return 0;
    }
    
    • 1

    信息

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