题目链接:http://7xjob4.com1.z0.glb.clouddn.com/78c8eef4017b53d6dc5ecf5e0bbb6486
题目大意:
在自然数中,存在这么一些数,他们的二进制能够以ABABAB……或者ABAB……A来表示。其中A代表全部由连续的1组成的字符串,B代表全部由连续的0组成的字符串。比如73,二进制表示为1001001。现在给出区间[l,r],问在这个区间里面,有多少个符合条件的数。
范围:0~2^63。
解题思路,打表+移位运算,移位运算要特别注意,强制转换一下
ac代码
#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <set>
#include <algorithm>
#define ll long long
#define ull unsigned long long
using namespace std;
const ll maxn=1e7+10;
ull x,y,flag;
set<ull> Set;
void INIT(){
Set.clear();
for(int len=0;len<=63;len++)
{
for(int i=1;i<=len;i++)
{//A
for(int j=0;j<=len-i;j++)
{//B
if(len%(i+j)==0){
int x=len/(i+j);
ull ans=0;
while(x){
for(int k=1;k<=i;k++){
ans=ans+( 1ull<<(x*(i+j)-k) );
}
x--;
}
Set.insert(ans);
}
if((len-i)%(i+j)==0){
int x=(len-i)/(i+j);
ull ans=0;
while(x){
for(int k=1;k<=i;k++){
ans=ans+( 1ull<<(x*(i+j)-k+i) );
}
x--;
}
for(int kk=1;kk<=i;kk++){
ans=ans+(1ull<<(kk-1));
}
Set.insert(ans);
}
}
}
}
}
int main(){
INIT();
while(~scanf("%llu%llu",&x,&y)){
//jdg();
int cnt=0;
for(set<ull>::iterator it=Set.begin();it!=Set.end();it++){
if(*it >= x && *it <= y){
cnt++;
}
}
printf("%d\n",cnt);
}
return 0;
}