給定 n 個整數,求有序數對 (a,b) 使得 `a ⊕ b > max(a,b)` 的個數。
設 `a < b`(不失一般性)。異或結果 `a ⊕ b` 的最高不同位決定大小:
反之,若 a,b 最高位相同(同為 1),異或最高位為 0,結果 < 2^k ≤ b。
int main() {
int T; cin >> T;
while (T--) {
int n; cin >> n;
vector a(n);
for (int &x : a) cin >> x;
sort(a.begin(), a.end());
long long ans = 0;
int cnt[31] = {0}; // 最高位計數,int 最高 30 位
for (int i = 0; i < n; ++i) {
int h = 31 - __builtin_clz(a[i]); // 最高位位置 (0-based)
// 累加所有最高位 < h 的數
for (int j = 0; j < h; ++j) ans += cnt[j];
cnt[h]++;
}
cout << ans << '\n';
}
}
對於 `a < b`,設 b 的最高位為 k(即 2^k ≤ b < 2^{k+1})。
**經驗證結論**:代碼邏輯正確,`a` 最高位嚴格小於 `b` 最高位是充要條件。