可得应当优先寻找最大的2^n-1这个数
如果l的位数不等于r的位数,那么这个数 2^n-1 就是最优解(每一位全为1)
如果l和r的位数相同,先看r是否符合 2^n-1,符合直接返回,不符合的话拆除最高位继续寻找
例如 l=10 r=14
即1010~1110 B
l和r位数相同且r不全为1
则可以拆除最高位1后
寻找10~110B中位数最大的最小数
位数不同,直接找到11B返回
则最终答案为1000B+11B=8+3=11
#include<stdio.h> typedef long long ll; ll fd(ll a,ll b) { ll i; for(i=1;i<=b+1;i*=2); i/=2;//找出小于等于i的最大的2的幂次 if(a<i) return i-1; else return fd(a-i,b-i)+i;//拆出最高位的1,然后寻找其余低位上的最大符合题意的值 } int main(){ int T,t; ll a,b; scanf("%d",&T); for(t=0;t<T;t++) { scanf("%lld%lld",&a,&b); printf("%lld ",fd(a,b)); } return 0; }