列表

详情


NC229803. zzq和他的位运算

描述

zzq 和他的队友像往常一样进行训练赛。这一天,他遇到了一道位运算的题目,但是 zzq 水平有限,解决不了这个问题,于是,他向他的队友 lxr 和 zyf 求助。聪明的 lxr 和 zyf 很快就解决了这个问题。为了嘲笑zzq,他们又给他出了另一道简单的位运算题,用来考验他。这个问题被描述如下:
一个数被称为“好数”,当且仅当它的二进制表示中出现的次数为奇数。例如的二进制表示为 ,其中出现的次数为,所以不是一个“好数” ;而的二进制表示为 ,其中出现的次数为3,所以7是一个“好数”
现在,给你一个区间 ,请你求出这个区间内有多少“好数”。
为了不被 lxr 和 zyf 嘲笑,请你帮助 zzq 解决这个问题。

输入描述

第一行给出一个整数 ,表示询问了  次。
接下来  行,每行两个整数

输出描述

输出  行,每行一个整数,第  行的整数代表第  次询问的答案。

示例1

输入:

1
1 1

输出:

1

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 334ms, 内存消耗: 2060K, 提交时间: 2022-10-26 15:55:50

#include<bits/stdc++.h>
typedef long long LL;
using namespace std;

int fun(LL T)
{
    LL x=T;
    int k=0;
    while(x)
    {
        if(x%2)
            k++;
        x/=2;
    }
    return k%2;
}

int main()
{
	int Q;
	cin>>Q;
	while(Q--)
    {
        LL L,R;
        int l=0,r=0;
        cin>>L>>R;
        if(L%2==1)
        {
            l=fun(L);
            L++;
        }
        if(R%2==0)
        {
            r=fun(R);
            R--;
        }
        cout<<l+(R-L+1)/2+r<<endl;
    }
	return 0;
}

C++ 解法, 执行用时: 322ms, 内存消耗: 2144K, 提交时间: 2021-11-22 14:05:03

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
bool pt(ll x){
	ll cn=0;
	while(x){
		if(x%2)cn++;
		x/=2;
	}
	if(cn%2)return true;
	else return false;
}
int main(){
	int t;
	cin>>t;
	while(t--){
		ll l,r;
		int f=0;
		cin>>l>>r;
		if(pt(l))f++;
		while(!pt(l))l--;
		while(!pt(r))r--;
		ll a=l&1? (l+1)/2: l/2+1;
		ll b=r&1? (r+1)/2 : r/2+1;
		cout<<b-a+f<<endl;
		

	}
}

Python3 解法, 执行用时: 1177ms, 内存消耗: 8108K, 提交时间: 2021-11-21 18:11:13

n = int(input())
def lqq(x):
    t = 0
    while x:
       if x & 1: 
           t += 1
       x >>= 1
    return t
def cmy(x):
    sum = 0
    if x & 1 or lqq(x) & 1:
        return  x // 2 + 1
    else : return x //2    
while n:
    n -= 1
    a, b = map(int, input().split())
    print(cmy(b) - cmy(a - 1))

上一题