题解:P11062 【MX-X4-T2】「Jason-1」加法

· · 题解

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

\rm 27pts

## $\rm 31pts 当我们将 $a$ 赋为 $a+b$,答案为 $a$。当我们将 $b$ 赋为 $a+b$,答案为 $b$。显然,差值是轮回的,但单方面不断累加只会离答案越来越远。 那不操作呢?就是 $|a-b|$。 ```cpp cout << min({abs(a), abs(b), abs(a - b)}) << endl; ``` ## $\rm 100pts

a,b\ge 1

上文已提。

a,b\le0

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

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

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

只要注意加绝对值。

a\times b<0

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

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

此时将一个数赋为 a+b,与将一个数赋为 |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 记录。