题意:A代表N个1,B代表M个0,条件是一个数的二进制满足 ABAB...A 或者 ABAB...AB ,可以不含有B,但至少有一个A,求给定L 和 R之间有多少个满足条件的数字。
思路: 数据的范围是0到2^63次方,对1到63长度的数字进行构造。
注意点: pow返回值要进行强制转换!!!!
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <queue>
#include <set>
#include <algorithm>
#include <stdlib.h>
#include <map>
#include <math.h>
using namespace std;
set< unsigned long long> s;
int main()
{
unsigned long long num;
for ( int len = 1; len<=64; len++ ) {
for ( int a = 1; a<=len ; a++ ) {
for ( int b = 0; b<=len-a; b++ ) {
string t = "";
num = 0 ;
if ( len%(a+b)==0 ) {
for ( int i=0; i<len/(a+b); i++ ) {
t.append(a,'1');
t.append(b,'0');
}
// cout<<"shang"<<endl;
}
if ( len%(a+b)==a ) {
for ( int i=0; i<len/(a+b); i++ ) {
t.append(a,'1');
t.append(b,'0');
}
t.append(a,'1');
// cout<<"xia"<<endl;
}
for ( int i=t.length()-1; i>=0; i-- ) num+=(t[i]-'0')*(long long)pow(2,t.length()-i-1);
s.insert(num);
}
}
}
unsigned long long m,n;
cin>>m>>n;
unsigned long long cnt = 0;
s.erase(0);
set<unsigned long long > ::iterator it;
for ( it = s.begin(); it!=s.end(); it++ )
{
if ( *it>=m && *it<=n ) {
++cnt ;
}
}
cout<<cnt<<endl;
return 0;
}