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;
}
}
时间: 2024-10-06 06:21:02