abc238D 兩數之和跟按位與

chenfy27發表於2024-03-07

題面:給定非負整數a和s,問是否存在一組非負整數(x,y),滿足x&y=a,並且x+y=s
範圍:0<=a,s<2^60

思路:異或是不進位加法,如果考慮進位,加上按位與的結果左移1位即可,也就是:x+y=(x^y)+((x&y)<<1),代入得x^y=s-2a,並且x&y=a,逐位分析可知,按位與的結果為1時,異或結果必為0。

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i,a,b) for(int i=a; i<=b; i++)
#define per(i,a,b) for(int i=b; i>=a; i--)

void solve() {
    int a, s;
    cin >> a >> s;
    if (s < 2 * a) {
        cout << "No\n";
        return;
    }
    s -= 2 * a;
    if ((s & a) != 0) {
        cout << "No\n";
        return;
    }
    cout << "Yes\n";
}

signed main() {
    cin.tie(0)->sync_with_stdio(0);
    int t = 1; cin >> t;
    while (t--) solve();
    return 0;
}

相關文章