题意:Almost Prime Number 是一个能且只能被一个素数整除的非素数,求一个区间内这样类型的数的个数。
思路:这个类型的数n = p^b (p是素数,b是大于1的整数),先用筛法求出10e6内的素数,然后将每个素数的不大于10e12的n(n=1,2,3......)次方存到一个有序数组里,最后用二分查找。
代码:
#include <map> #include <set> #include <cmath> #include <queue> #include <stack> #include <cstdio> #include <vector> #include <iomanip> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> #define ll long long #define mod 1000000007 #define mem(a) memset(a,0,sizeof(a)) using namespace std; const int maxn = 1 + 5, inf = 0x3f3f3f3f; bool vis[1000000+5]; ll ans[100000000]; int k; void prime(){ memset(vis,0,sizeof(vis)); vis[0] = vis[1] = false; for(int i = 2 ; i <= 1000 ; i ++ ) for(int j = i*i ; j <= 1000000 ;j +=i ) vis[j] = true; k = 0; for(ll i = 2 ; i <= 1000000 ; i ++ ){ if(!vis[i]) for(ll j = i*i ; j <= 1000000000000 ; j = j*i ) ans[k++] = j; } sort(ans,ans+k); } int main(){ // freopen("in.txt","r",stdin); // freopen("out.txt","w",stdout); prime(); ll L,R; int kase; cin>>kase; while(kase--){ cin>>L>>R; int p1 = lower_bound(ans,ans+k,L) - ans; int p2 = lower_bound(ans,ans+k,R) - ans; cout<<p2-p1<<endl; } return 0; }