有关异或问题的专题


分析:
不难发现首先我们找到二进制最大的为1的那个数maxx 我们得到的答案起码最高位是1

然后如果想要答案最大 就想尽可能使得后面为0的均为1 发现 maxx-1 就是后面位均为1

这样两者异或一定是最大的

但是可能[L,R]没有将两者包括 也就是说区间最高位都是1 那这样怎么办?

这时候发现无论我们怎么选两个数 得到的答案最高位一定是0 如果这样的话可以就不用考虑最高位就行 依次递归就好

#include
#include
#define LL long long
using namespace std;
LL bitcnt(LL x){  //返回x的二进制位数 
	LL cnt=0;
	while(x)cnt++,x>>=1;
	return cnt;
}
LL solve(LL l,LL r){
	LL a=bitcnt(l),b=bitcnt(r);
	if(a!=b) return (1LL<>a>>b;
	cout<

这个题数据开到非常大都可以

首先我们可以打表找规律 发现除去第一个数 剩下的就是每四个一轮回 并且这四个一轮回的第1和第3个数是确定的

这样就好办了

点击查看代码
#include
using namespace std;
#define lowbit(x) x&(-x)
#define ll long long
int main(){
	int n,start;
	cin>>n>>start;
	if(n==1){
		cout<