UVALive 7279 Sheldon Numbers(位运算、暴力)

题目链接:http://7xjob4.com1.z0.glb.clouddn.com/78c8eef4017b53d6dc5ecf5e0bbb6486

题目大意:

在自然数中,存在这么一些数,他们的二进制能够以ABABAB……或者ABAB……A来表示。其中A代表全部由连续的1组成的字符串,B代表全部由连续的0组成的字符串。比如73,二进制表示为1001001。现在给出区间[l,r],问在这个区间里面,有多少个符合条件的数。

范围:0~2^63。


解题思路,打表+移位运算,移位运算要特别注意,强制转换一下

ac代码

#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <set>
#include <algorithm>
#define ll long long
#define ull unsigned long long

using namespace std;
const ll maxn=1e7+10;
ull x,y,flag;

set<ull> Set;

void INIT(){
	
	Set.clear();
	
	for(int len=0;len<=63;len++)
    {
        for(int i=1;i<=len;i++)
        {//A
            for(int j=0;j<=len-i;j++)
            {//B
                if(len%(i+j)==0){
                    int x=len/(i+j);
                    ull ans=0;
                    while(x){
                        for(int k=1;k<=i;k++){
                      		ans=ans+( 1ull<<(x*(i+j)-k) );	
						}
                        
						x--;
                    }
                
                	Set.insert(ans);
                }
                if((len-i)%(i+j)==0){
                	int x=(len-i)/(i+j);
                    ull ans=0;
                    while(x){
                        for(int k=1;k<=i;k++){
                      		ans=ans+( 1ull<<(x*(i+j)-k+i) );	
						
						}
						x--;
                    }
                    for(int kk=1;kk<=i;kk++){
                    	ans=ans+(1ull<<(kk-1));
					}
            
                    Set.insert(ans);
				}
            }
        }
    }	
}



int main(){
	
	INIT();
	while(~scanf("%llu%llu",&x,&y)){
			
		//jdg();
		int cnt=0;
		for(set<ull>::iterator it=Set.begin();it!=Set.end();it++){
			if(*it >= x && *it <= y){
				cnt++;
			}
		}
		printf("%d\n",cnt);
	}
	
	
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值