题意
求区间内,其本身不是质数但是只有一个质因子的数有多少个。
题解
首先确定这样的数是什么,是质数的次幂形式,因为只有这样的数他本身不是质数但是其质因子只有一个。那么我们看数据范围,符合条件的数至少是质数的平方,所以我们只用找
之内的质数就好了。对于每个找到的质数,我们将其小于
的次幂都存在一个数组当中。由于次幂增长的很快,所以这样的数的个数大概只有
个。然后我们把存下的数进行排序。然后对于给定的区间
,我们用二分去找上下界,一减就是区间范围内这样数的个数了。注意的是若用c++,上界可以用
,下界用
去找。
复杂度
时间复杂度为
代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int prime[N];
int vis[N];
int cnt=0;
int tot=0;
long long num[N];
void init()
{
for(int i=2;i<N;i++)
{
if(!vis[i])
{
prime[cnt++]=i;
for(long long j=i*i;j<=1e12;j=j*i)
{
num[tot++]=j;
}
}
for(int j=0;j<N&&i*prime[j]<N;j++)
{
vis[i*prime[j]]=1;
if(i%prime[j]==0)
break;
}
}
sort(num,num+tot);
}
int main()
{
init();
int t;
scanf("%d",&t);
while(t--)
{
long long l,r;
scanf("%lld%lld",&l,&r);
printf("%d\n",upper_bound(num,num+tot,r)-lower_bound(num,num+tot,l));
}
return 0;
}



京公网安备 11010502036488号