1 条题解

  • 0
    @ 2025-8-24 23:03:55

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar 细数繁星
    大道不孤,大爱无疆 || https://www.cnblogs.com/2044-space-elevator

    搬运于2025-08-24 23:03:55,当前版本为作者最后更新于2024-09-17 14:20:14,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    分讨,比赛的时候想了 20min,感觉黄虚高?

    27pts\rm 27pts

    a,b10|a|,|b|\le10。暴力可解。

    31pts\rm 31pts

    a,ba,b 为正整数。有规律:答案为 min{a,b,ab}\min\{a,b,|a-b|\},这是为什么?

    当我们将 aa 赋为 a+ba+b,答案为 aa。当我们将 bb 赋为 a+ba+b,答案为 bb。显然,差值是轮回的,但单方面不断累加只会离答案越来越远。

    那不操作呢?就是 ab|a-b|

    cout << min({abs(a), abs(b), abs(a - b)}) << endl;
    

    100pts\rm 100pts

    a,b1a,b\ge 1

    上文已提。

    a,b0a,b\le0

    和两数大于 00 的情况几乎一样。

    为什么这么说?因为结果终究为正数,两负数相减的绝对值等于两负数的绝对值相减的绝对值。

    至于累加,因为是负数,在不考虑正负情况下与情况一一样。

    只要注意加绝对值。

    a×b<0a\times b<0

    这个就很神奇了:对于此情况,所有结果都为 00.

    其实相当于只要能找到一个数 kk,保证 aka\mid kbkb\mid k,那么就可以归 00。因为所有的累加操作最终会使它们的结果一样(补充:rui_er 大佬的结论,此情况下等同于使用辗转相除法,上述提出的也就是最小公倍数,最小公倍数与最大公因数有关,因此产生该结论)。

    此时将一个数赋为 a+ba+b,与将一个数赋为 ab|a-b| 效果相同,所以有这个结论。

    满分代码

    #include <bits/stdc++.h>
    #define rty printf("Yes\n");
    #define RTY printf("YES\n");
    #define rtn printf("No\n");
    #define RTN printf("NO\n");
    #define rep(v,b,e) for(int v=b;v<=e;v++)
    #define repq(v,b,e) for(int v=b;v<e;v++)
    #define rrep(v,e,b) for(int v=b;v>=e;v--)
    #define rrepq(v,e,b) for(int v=b;v>e;v--)
    #define stg string
    #define vct vector
    using namespace std;
    
    typedef long long ll;
    typedef unsigned long long ull;
    
    void solve() {
      ll a, b;
      cin >> a >> b;
      if (a < b) swap(a, b);
      if (a * b >= 0) cout << min({abs(a), abs(b), abs(a - b)}) << endl;
      else {
        cout << 0 << endl;
      }
    } 
    
    
    main() {
    	int t; cin >> t; while (t--) solve();
    	return 0;
    }
    
    

    AC 记录。

    • 1

    信息

    ID
    10254
    时间
    1000ms
    内存
    512MiB
    难度
    3
    标签
    递交数
    0
    已通过
    0
    上传者