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;
}

猜你喜欢

转载自blog.csdn.net/insist_77/article/details/80268325