Gym - 101086L Chance 解答

本文介绍了一种算法,用于解决特定区间内整数的二进制表示中1的个数为质数的问题。通过预处理和快速查找,有效地计算出符合规则的整数数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


Input


The first line of input contains an integer T (1 ≤ T ≤ 105), the number of test cases.

Each test case will consist of two space - separated integers: L and R (0 ≤ L ≤ R ≤ 105).


Output


For each test case, print the number of integers between L and R that have a prime number of ones in their binary representation.


Example Input


3
2 10
1 19
3 101

Output

6
13
65


题意:

把一个区间【L,R】中,所有正数都用其二进制表示出来,若 这些整数的 二进制表示中 1 的个数 为质数,则计数。求区间【L,R】中,求符合规则的整数 个数。


AC代码:

#include<cstring>   //AC
#include<cmath>
#include<cstdio>

int value[100000+10];   //value[i] 是 记录从 0 到 i 中,二进制表示中,含有质数个 1 的整数的数目
int prim[20];

int main()
{
    memset(value,0,sizeof(value));
	value[1]=0;value[0]=0;

    memset(prim,0,sizeof(prim));
	prim[2] = prim[3] = prim[5] = prim[7] = 1;
	prim[11]= prim[13] =prim[17]=1;    //因为 2^17 = 13172 > 1e5,所以到17就好

	for(int i=2;i<=100005;i++)  //打表
	{
		int temp = i;
		int sum = 0;
		while(temp)
		{
		    if(temp%2==1)
                        ++sum;
		    temp/=2;
		}
		if(prim[sum] == 1) //这样做,挺好,比利用for循环或者 set 去找方便 (学习的地方)
                    value[i]=value[i-1]+1;
		else
                    value[i]=value[i-1];
	}
	int T,L,R;
	scanf("%d",&T);
	while(T--) {
		scanf("%d%d",&L,&R);
        printf("%d\n",value[R]-value[L-1]);
	}
	return 0;
}
学习代码: http://www.7zhang.com/index/cms/read/id/445544.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值