給定兩個非負整數 s(和)與 d(絕對差),求兩個非負整數 x、y(x ≥ y),使得:
x + y = s
|x - y| = d
若無解,輸出 "impossible"。多組測試數據。
設 x ≥ y,則 x - y = d。聯立方程:
x + y = s x - y = d ----------- 2x = s + d → x = (s + d) / 2 2y = s - d → y = (s - d) / 2
解存在的必要條件:
s ≥ d(否則 y 為負)s + d 為偶數(否則 x 非整數)s - d 為偶數(等價於上條)綜上:s ≥ d 且 (s + d) % 2 == 0。
T。s, d。s < d 或 (s + d) % 2 != 0,輸出 "impossible"。x = (s + d) / 2,y = (s - d) / 2,輸出 x y。#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
if (!(cin >> T)) return 0;
while (T--) {
long long s, d;
cin >> s >> d;
if (s < d || ((s + d) & 1)) {
cout << "impossible\n";
} else {
long long x = (s + d) / 2;
long long y = (s - d) / 2;
cout << x << ' ' << y << '\n';
}
}
return 0;
}
時間 O(T),空間 O(1)。純數學題,無需複雜數據結構。
long long 防溢出。x 再輸出 y。s = d = 0 時解為 0 0。