Sheldon Numbers Gym

来源:互联网 发布:淘宝客推广qq空间 编辑:程序博客网 时间:2024/06/05 20:20

题意: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; }


0 0
原创粉丝点击