题解CF1775C
传送门:CF1775C
题意
对于给定的 $n$ 和 $x$,求可能存在的最小的 $m$, 使得 $n\And (n+1) \And (n+2) \And \cdots \And m = x $。如果不存在,输出 $-1$。
思路
先给出两个结论:
- 对于一个二进制数的累加取与,必然是一个低位的 $1$ 逐渐消失的过程。
- 如果 $n<x$,必然输出 $-1$。
如果 $n=x$,必然输出 $n$。
以此 $x$ 必然是由 $n$ 二进制的前面一部分和一串 $0$ 组成。
为了说明方便,将这一串 $0$ 的第一位记为 $id$($id$ 为成立的最小值)。
$n$ 的 $id$ 位必然为 $1$。
倘若 $n$ 的 $id+1$ 位是 $1$,那么 $m$ 在改变第 $id$ 位时必然也会改变第 $id+1$ 位,输出 $-1$。
否则 $m=x|(1<<id+1)$。
AC代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5+5;
int n, m,Q,p[70];
signed main() {
cin>>Q;
p[0]=1;
for(int i=1; i<=63; ++i) {
p[i]=p[i-1]*2;
}
while(Q--) {
int x;
cin>>n>>x;
if(x>n) {
cout<<-1<<endl;
continue;
} else if(x==n) {
cout<<x<<endl;
continue;
}
int ls=x^n,cnt=0;
bool flag=0;
while(ls) {
ls=ls>>1;
cnt++;
}
for(int i=0; i<=cnt; ++i) {
if(x&(p[i])) flag=1;
}
if(flag||n&p[cnt]) cout<<-1<<endl;
else {
cout<<(x^p[cnt])<<endl;
}
}
return 0;
}