Sheldon Numbers

版权声明:转载时 别忘了注明出处 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)

猜你喜欢

转载自blog.csdn.net/ZCY19990813/article/details/89880691