数学专项number_theory:UVa 10539

来源:互联网 发布:preview.exe软件下载 编辑:程序博客网 时间:2024/05/22 10:48

简而言之,almostprime就是prime的n次方数(n>2)。先筛出10^6内的prime,然后遍历所有素数,枚举素数的次方数即可。因为a^n增长的非常快,所以时间复杂度是可以接受的。

#include <iostream>#include <cstdio>#include <cstring>using namespace std;int T,p;int vis[1000010];int prime[1000010];void init(){    memset(vis,0,sizeof(vis));    for(int i=2;i<=1000;i++) if(!vis[i])    {        for(int j=i*i;j<=1000000;j+=i) vis[j]=1;    }    p=0;    for(int i=2;i<=1000000;i++) if(!vis[i])        prime[p++]=i;}int main(){    freopen("in.txt","r",stdin);    init();    cin>>T;    while(T--)    {        long long l,h;        cin>>l>>h;        int ans=0;        for(int i=0;i<p;i++)        {            long long t=prime[i],tmp=t*t;            while(tmp<l) tmp*=t;            while(tmp>=l&&tmp<=h)            {                ans++;                tmp*=t;            }        }        cout<<ans<<endl;    }    return 0;}