Codeforces Round #843 (Div. 2) C Interesting Sequence
Problem - C - Codeforces
题意:
给定n和x,求最小的m使得:
n和x范围是1e18
思路:
看到1e18,要不就是打表找规律,要不就是O(1),要不就是O(logn)
因为这题是bitmask,因此按位考虑,是O(logn)的
让我们凭空求m,要不枚举,要不二分,要不直接求
枚举肯定不行
二分的话不能维护区间与的结果
因此我们根据n和x的位表示直接求m
Code:
#include <bits/stdc++.h>
using namespace std;
#define int long long
int n,x;
void solve(){
cin>>n>>x;
bitset<64> b1(n),b2(x);
int l=n,r=5e18;
for(int i=63;i>=0;i--){
if(b1[i]==0&&b2[i]==0) continue;
else if(b1[i]==0&&b2[i]==1){
cout<<-1<<'\n';
return;
}else if(b1[i]==1&&b2[i]==1){
r=min(r,(n/(1ll<<i)+1)*(1ll<<i)-1);
}else{
l=max(l,(n/(1ll<<i)+1)*(1ll<<i));
}
}
if(l<=r) cout<<l<<'\n';
else cout<<-1<<'\n';
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int __=1;cin>>__;
while(__--)solve();return 0;
}
还没有评论,来说两句吧...