//https://codeforces.com/problemset/problem/1554/C
#include<bits/stdc++.h>
#include<unordered_map>
#include<array>
#define ll long long
#define ull unsigned long long
#define all(a) a.begin(),a.end()
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-4;
const ll mod = 1e9 + 7;
const int N = 2e5 + 5;
/*
经典问题 : 已知n, p, 求 k 的最小值使得 n ^ k >= p 成立
从高到低枚举n, p的每一位
若 p 当前位为 1, 则 k 的当前位由 n 决定
若 p 当前位为 0, 若 n 当前位为 1, 则 k 的当前位为 1
若 p 当前位为 0, 若 n 当前位为 0, 则 k 的当前位为 0, 并且k后面的每一位都可以为0, 因为已经满足 n ^ k >= p
*/
int n, m;
void solve()
{
cin >> n >> m;
int p = m + 1;
int k = 0;
for (int i = 30; i >= 0; i--)
{
if ((p & (1 << i)))
{
if ((n & (1 << i)) == 0)
k += (1 << i);
}
else
{
if ((n & (1 << i)))
break;
}
}
cout << k << '\n';
}
signed main()
{
IOS;
int t = 1;
cin >> t;
while (t--)
solve();
return 0;
}
Mikasa(已知n, p, 求 k 的最小值使得 n ^ k >= p 成立)
最新推荐文章于 2024-10-16 19:08:56 发布