标签:int wei ++ long 牛客 while 寒假 ans 集训营
原题链接:点我转移
官方题解的做法:
如果 a=b ,那么答案 =a ;
否则 a≠ba≠b ,
考虑a和b的二进制表示从高到低第一个不同的位i,
必定b的第i位=1,a的第i位=0。
那么可以断定,对于答案的二进制表示,
(1) 比第i位更高的那些位一定跟a相同。
(2) 第i位及比第i位更低的那些位一定为1。
(1)是显然的,(2)是由于把a中比第i位更低的那些位都置为1得到的数一定在区间[a,b]中。
大佬的ac代码:
#include <bits/stdc++.h> using namespace std; int main() { long long x,y,m,n; while(~scanf("%lld%lld",&x,&y)) { m=x|y; long long t=1; while(t<=y) { if(x+t<=y)m|=t; t<<=1; } cout << m << endl; } return 0; }
菜鸡的我的ac代码
纯粹找规律
#include<bits/stdc++.h> using namespace std; int www(long long n,long long m)///找n与m的第一个不同位的位置 { int a[70]= {0},b[70]= {0},i=0,j=0; while(n) { a[i++]=n%2; n/=2; } while(m) { b[j++]=m%2; m/=2; } int k=--i; for(; k>=0; k--) if(a[k]!=b[k]) { break; } return ++k; } long long sss(long long n,int wei)///得到n从wei位开始后面的变十进制得值 { int a[100]= {0},i=0; while(wei--) { a[i++]=n%2; n/=2; } long long ans=0; for(int j=i-1; j>=0; j--) ans=ans*2+a[j]; return ans; } long long poww(int a,int n)///a的n次方 { long long ans=1; while(n--) ans*=a; return ans; } long long aaa(long long n)///找小于n的最大的2的次方值 { long long m=1; while(m<=n) m*=2; return m/2; } int main() { long long n,m; while(cin>>n>>m) { long long ans=aaa(m);///得到小于m的最小的2的次幂的值 if(ans>n)///如果ans在n到m这和区间直接输出ans*2-1。。这是一个规律。。试出来的 { cout<<ans*2-1<<endl; } else///然后其他情况 { int wei=www(n,m);///取得n与m的二进制从高位开始第一个不同的位的位置 long long shen=sss(n,wei);///得到n二进制wei开始到最后一位变十进制得值 long long an=n+poww(2,wei)-1-shen;///n+2的wei的次方再减去1再减去n的二进制wei位之后的值 cout<<an<<endl; } } return 0; }
标签:int,wei,++,long,牛客,while,寒假,ans,集训营 来源: https://www.cnblogs.com/tp25959/p/10349043.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。