UVA 10539 - Almost Prime Numbers(素数筛+打表)
题目链接 https://cn.vjudge.net/problem/UVA-10539
【题意】
输入两个正整数L,R(1<=L<=R<=1e12)统计区间 [L,R] 中有多少个数字满足它本身不是素数,但只有一个素因子如4,27
【思路】
只有素数的若干次幂满足要求,所以可以预处理1e6以内的素数,然后把所有可能是结果的数字都存到一个集合中,二分搜索输出答案即可
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+50;
const ll maxa=1e12+50;
bool notprime[maxn];
vector<ll> ans;
void init(){
for(int i=2;i<maxn;++i){
if(!notprime[i]){
ll x=(ll)i*(ll)i;
while(x<maxa){
ans.push_back(x);
x*=(ll)i;
}
for(int j=i*2;j<maxn;j+=i) notprime[j]=true;
}
}
sort(ans.begin(),ans.end());
ans.erase(unique(ans.begin(),ans.end()),ans.end());
}
int main(){
init();
int T;
scanf("%d",&T);
while(T--){
ll le,ri;
scanf("%lld%lld",&le,&ri);
ll a=upper_bound(ans.begin(),ans.end(),ri)-ans.begin();
ll b=lower_bound(ans.begin(),ans.end(),le)-ans.begin();
printf("%lld\n",a-b);
}
return 0;
}