nitacm20317 来自张司机的挑战书
题目:让你求从x到y中(1<=x<=y<=10^18),二进制一的个数最多的数是哪个,如果有多个相同的答案,输出最小的。
题目链接:https://www.nitacm.com/problem_show.php?pid=20317
类似题目及题解:https://www.cnblogs.com/myrtle/p/11662171.html
分析:先把x和y转换成二进制位:
(假设x,y最高位不是同一位):则答案可以取11111
(如果LR最高位相同):则最高位的数一定取,然后比较减去最高位后,剩下的数
特判:y的二进制全是1时,答案为y。
注意:&运算优先级低于==,需要加括号
#include<bits/stdc++.h> using namespace std; int cal2(long long n)//计算二进制有几个1 { int cnt=0; for(int i=62;i>=0;i--) { long long tmp=1ll<<i; if(n>=tmp)n-=tmp,cnt++; } return cnt; } long long cal(long long x,long long y) { for(int i=62;i>=0;i--) { long long tmp=1ll<<i; if((tmp&y)==tmp)//最高位 { if((tmp&x)==(tmp&y))//最高位相等 { return tmp+cal(x-tmp,y-tmp); } else//最高位不相等 { long long ans=0; for(int j=i-1;j>=0;j--) { ans+=(1ll<<j); } return ans; } } } return 0; } int main() { int T; long long x,y; cin>>T; while(T--) { cin>>x>>y; long long ans=cal(x,y); if(cal2(y)>cal2(ans))ans=y; cout<<ans<<endl; } return 0; }