题意
求区间内,其本身不是质数但是只有一个质因子的数有多少个。
题解
首先确定这样的数是什么,是质数的次幂形式,因为只有这样的数他本身不是质数但是其质因子只有一个。那么我们看数据范围,符合条件的数至少是质数的平方,所以我们只用找
之内的质数就好了。对于每个找到的质数,我们将其小于
的次幂都存在一个数组当中。由于次幂增长的很快,所以这样的数的个数大概只有
个。然后我们把存下的数进行排序。然后对于给定的区间
,我们用二分去找上下界,一减就是区间范围内这样数的个数了。注意的是若用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; }