喜爱 二进制

小s喜欢的数字是二进制表示中只有一位0的数。给定一个区间[L, R],需要找出区间内这类数的数量。通过观察发现,这种数可以表示为2^i - 1 - 2^k的形式,可以通过枚举二的幂次来求解。" 99657082,8659461,Python脚本:导出Zabbix数据并自动发送邮件,"['Python', '自动化', 'Zabbix']
摘要由CSDN通过智能技术生成

问题 E: 喜爱
时间限制: 1 Sec 内存限制: 128 MB

题目描述
小s最近对数字情有独钟。他又发现了一种神奇的数字。对于数x,如果它二进制表示中只有一位是0,则x就会被小s所喜爱。比如5,二进制为101,则它被小s所喜爱。

现在,小s想知道,对于一个区间[L,R],有多少数是他所喜爱的。
输入
输入包含多组数据。
输入第一行T,表示数据组数。
每组数组仅有一行,包含两个正整数[L,R]。
输出
对于每组数据输出一行,表示答案。
样例输入 Copy
2
5 10
2015 2015
样例输出 Copy
2
1
提示
对于30%的数据:L,R≤106,T≤10
对于60%的数据:L,R≤1010,T≤100
对于100%的数据:L,R≤1018,T≤10000

这个题一开始自己做没做出来(还是自己懒),让后去看了看题解,看的时候比较浮躁,头疼,也没看懂。
又回去自己看了看,发现一个二进制只有一个0的数,比如 11110,11101… ,这一类的二进制都是由11111减去一个2的幂数出来的,而11111是由100000-1得到的,只有一个零的二进制可以由 2 ^ i - 1 - 2 ^ k ( k = 0 ~ i - 2 ) ,加上二的幂次也不是很多,所以就直接找到第一个 fun[a]>=l fun[b]>=r 的数,让后枚举[a,b]的二的幂次,依次模拟上述操作,让后判断得到的数是否在范围内即可。

#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值