版权声明:转载时 别忘了注明出处 https://blog.csdn.net/ZCY19990813/article/details/89880691
Sample Input
1 10
70 75
Sample Output
10
1
题意:一个数的二进制满足ABABA或者是ABAB的情况是完美的,要求A里面全是1,并且个数不为0,B里面全是0,个数可以为0,例如:十进制的5,对应2进制101,满足条件,而12,对应2进制是1100,就不满足条件,二进制的110满足条件。给出一个区间的范围,问此区间有几个满足条件的数。
思路:遍历长度64,采用构造法,先构造好A和B,往一个数组里面放,必须小于64位,满足条件转化成十进制往set里面放,最后用迭代器直接遍历区间长度就可以了。
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <sstream>
#include <cstdio>
#include <vector>
#include <string>
#include <cmath>
#include <stack>
#include <queue>
#include <map>
#include <set>
#define MAX 0x3f3f3f3f
#define fori(a,b) for(int i=a;i<=b;i++)
#define forj(a,b) for(int j=a;j<=b;j++)
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const double PI = acos(-1);
const int M=1e6+10;
const int mod=1e9+7;
set <ll> s;
int main()
{
ll i,j,T,m,l,r,k,p,q;
for(i=1;i<=64;i++){//长度
for(j=1;j<=i;j++){//A可能的长度
for(k=0;k<=i;k++){//B可能的长度
ll m=0,flag=0;
int t[200];
memset(t,0,sizeof(t));
while(1){//当t数组里面的长度为i时跳出
for(p=1;p<=j;p++)//先放入A
t[m++]=1;
if(m==i){ //判断是否满足条件
flag=1;
break;
}
else if(m>i){
flag=0;
break;
}
for(q=1;q<=k;q++)//在放入B
t[m++]=0;
if(m==i){ //判断是否满足条件
flag=1;
break;
}
else if(m>i){
flag=0;
break;
}
}
if(flag==1){
ll e=1;
ll ans=0;
for(p=i-1;p>=0;p--){ //转化成10进制
ans+=t[p]*e;
e*=2;
}
//cout<<ans<<endl;
s.insert(ans);
}
}
}
}
while(~scanf("%lld%lld",&l,&r))
{
set<ll>::iterator it;
ll ans=0;
for(it=s.begin();it!=s.end();it++){
if(*it>=l&&*it<=r)
ans++;
}
printf("%lld\n",ans)