NC219473. 计算几何
描述
由于小 追女孩子的时间不多了,于是这里只有简单版题意。
共有 组询问,每次给定 ,你需要求出在 中有多少个数在二进制下 的个数有奇数个。
例如 ,在二进制下有 个 ,那么如果 ,答案为 。
例如 ,在二进制下有 个 ,那么如果 ,答案为 。
输入描述
第一行一个整数 。
接下来 行,每行两个整数 。
输出描述
输出 行,每行 个整数代表答案。
示例1
输入:
1 3 4
输出:
1
说明:
,那么在 中只有 在二进制下有奇数个 。Python3 解法, 执行用时: 18ms, 内存消耗: 2832K, 提交时间: 2021-05-21 19:44:17
def cal(x): rtn = x // 2 if x % 2 == 0: sm = 0 while x: sm += x % 2 x //= 2 rtn += sm % 2 else: rtn = (x + 1) // 2 return rtn if __name__ == '__main__': t = int(input()) while t > 0: l, r = map(int, input().split()) print(cal(r) - cal(l - 1)) t -= 1
pypy3 解法, 执行用时: 47ms, 内存消耗: 18676K, 提交时间: 2021-05-22 11:17:45
def check(num): ans=2*(num//4) if num%4==0: ans+=1 if bin(num).count('1')%2 else 0 elif num%4==1: ans+=1 elif num%4==2: ans+=2 if bin(num).count('1')%2 else 1 else: ans+=2 return ans T=int(input()) for i in range(T): l,r=input().split() l,r=int(l),int(r) print(check(r)-check(l-1))
C++ 解法, 执行用时: 4ms, 内存消耗: 456K, 提交时间: 2022-05-21 11:09:22
#include <bits/stdc++.h> using namespace std; long long f(long long x) { return (x >> 1) + ((x & 1) | (__builtin_popcount(x) & 1)); } int main() { int T; cin >> T; while (T--) { long long a, b; cin >> a >> b; cout << f(b) - f(a - 1) << endl; } }