UVA Almost Prime Numbers (数论)
题意: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;
}