本文共 1308 字,大约阅读时间需要 4 分钟。
【...】
是寒假做的题解,但是不知道什么时候设置成私密了,奇奇怪怪的
【题解】
这道题真的绊了我很久很久...但是通过量好高啊...于是
我们知道只有0|0才是0,把a,b化成二进制先按位或一遍,然后我们可以发现每2^(i-1)个数可以把第i位从0->1,如果a的二进制数的位数小于b,那么显然可以把b的第一位后边的每一位都或成1。
当然我们知道肯定有更简便合理的做法(哭了我真是太菜了),如下:
法一:两个不相同的数做或运算只会变大,a+1至少1位要进行改变,a|(a+1)每次起码多补1位0,直到当前数字超过b为止。
法二:如果a和b的二进制位数一样,那么直接从左往右找到第一个不相同的数字,然后把后面所有的数都变成1,这个就是答案(因为从a到b过程中,后面的所有位都会0到1到0的变化,所以后面的数都是1)。如果a和b的位数不相同,那么答案就是b的最高位为1并且后面都是1,即2^(b的位数)-1。(代码我就不写了因为好像也没有那么简便hhh)
【法一】
int main(){ long long a,b; while(cin>>a>>b) { while(a
【原代码】
#include#define mem(a,b) memset(a,b,sizeof(a))using namespace std;typedef long long ll;int cul(ll x){ int c=0; while(x) { c++; x/=2; } return c;}int main(){ ll a,b; while(~scanf("%lld%lld",&a,&b)) { int c1=cul(a),c2=cul(b); if(c2>c1) b=(ll)pow(2,c2)-1; else { ll c=b-a,t=1; queue q; while(b) { int x=a%2,y=b%2; if(x==0&&y==0&&t>c) q.push(0); else q.push(1); a/=2,b/=2; t*=2; } t=1; while(!q.empty()) { if(q.front()==1) b=b|t; q.pop(); t*=2; } } printf("%lld\n",b); } return 0;}
转载地址:http://xfben.baihongyu.com/