4982. 进制 - AcWing题库
给定两个整数 a,b
请你计算,在 [a,b] 范围内有多少个整数满足其二进制表示恰好有一个 0。
不考虑前导 0。
例如,当 a=5,b=10 时,[5,10]范围内的所有整数及其二进制表示如下:
可以看出,只有 5 和 6 满足二进制表示恰好有一个 00。
输入格式
共一行,两个整数 a,b。
输出格式
一个整数,表示满足条件的整数数量。
数据范围
前 66 个测试点满足 1≤a≤b≤104。
所有测试点满足 1≤a≤b≤1018。输入样例1:
5 10
输出样例1:
2
输入样例2:
2015 2015
输出样例2:
1
输入样例3:
100 105
输出样例3:
0
根据题意,数据范围过大,无法枚举 a~b 计算,但 1e18 的数肯定不超过2的64次方,所以可以枚举从 1 到 2 的64次方中所有二进制表示中所有数都是 1 的数,然后依次枚举计算0不位于首位的情况下的数是多少,则可以计算出所以合法的数,然后判断是否在a-b之间就可以了
AC code:
#include<bits/stdc++.h> using namespace std; long long a, b; long long arr[100010]; int main() { cin >> a >> b; long long ans = 0; int index = 0; for (int i = 1; i < 63; i++) { long long x = 1; int j = 1; while (j <= i) { x = x << 1; x++; j++; } for (int u = 1; u <= i; u++) { long long c = 1; c = c << (u - 1); long long f = x; f = f ^ c; arr[index++] = f; } } for (int i = 0; i < index; i++) { if (a <= arr[i] && b >= arr[i]) ans++; } cout << ans; }