码迷,mamicode.com
首页 > 其他好文 > 详细

UVALive-7279 - Sheldon Numbers【暴力】

时间:2016-08-06 19:15:05      阅读:322      评论:0      收藏:0      [点我收藏+]

标签:


UVALive-7279 - Sheldon Numbers


技术分享

题目链接:7279

题目大意:给出[a,b],问在这个范围内的十进制数字,转化为二进制之后,形式满足ABAB…AB或者ABAB…A的有几个。(A表示连续的1,B表示连续的0)
第一种形式A的个数 > 0,B的个数 > 0.
第二种形式A的个数>0,B的个数可以等于0

题目思路:暴力出所有满足情况的数字,然后二分查找大于等于a,b的数字的下标。代码细节需要注意很多。

以下是代码:

#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
vector <ll> vec;
void init()
{
    //只有a
    ll num = 1;
    vec.push_back(num);
    for (int i = 0; i < 63; i++)
    {
        num = (num << 1) | 1;
        vec.push_back(num);
    }

    for (int i = 1; i <= 63; i++)
    {
        for (int j = 1; (i + j) <= 63; j++)
        {
            ll num = 1;
            for (int k = 0; k < i - 1; k++)
            {
                num = (num << 1) | 1;
            }
            ll A = num;

            num = num << j;

            if ((i+j)<= 63) {vec.push_back(num);}
            if ((i+j + i) <= 63) {vec.push_back((num << i) | A);}
            int len1 = i,len2 = j,len = i + j;
            while(1)
            {
                if ((len1 + len2) + len <= 63)
                {
                    vec.push_back((num << len) | num);
                }
                else break;
                num = (num << len) | num;
                if (((len1 + len2) + len + i) <= 63)
                {
                    vec.push_back((num << i) | A);
                }
                len1 += i;
                len2 += j;
            }
        }
    }
    sort(vec.begin(),vec.end());
}
int main()
{
    ll n,m;
    init();
    while(cin >> n >> m)
    {
        int pos = lower_bound(vec.begin(),vec.end(),n) - vec.begin();
        int pos2 = upper_bound(vec.begin(),vec.end(),m) - vec.begin();
        cout << pos2 - pos<< endl;
    }
}

UVALive-7279 - Sheldon Numbers【暴力】

标签:

原文地址:http://blog.csdn.net/loy_184548/article/details/52137657

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!