UVA - 10539Almost Prime Numbers

痴心易碎 提交于 2020-03-01 16:19:30

Almost Prime Numbers
Def of Almost Prime Numbers:
自身不是素数,但只有一个素数因子,
由唯一分解定理可得,这样的数只能是pc(c>=2)p^c(c>=2)

Solution1:

在这里插入图片描述

#include<stdio.h>
#include<iostream>
#include<cmath>
#include<math.h>
#include<string>
#include<string.h>
#include<algorithm>
#define ll long long
using namespace std;

const int maxn=1e6+10;
//欧拉筛法( O(n)  )
int np=0,p[maxn],v[maxn+10];
int gg(int n){
    for(int i=2;i<=n;i++){
        if(!v[i]) p[++np]=i;//此时的i为某个质数
        for(int j=1;j<=np && i*p[j]<=n;j++){
            v[i*p[j]]=1; //用这个合数的最小质因子去筛掉这个合数
            if(i%p[j]==0) break;
        }
    }
    return np;
}
int t;
ll l,r;
int main(){
    cin>>t;
    gg(maxn);
    while (t--)
    {
        scanf("%lld%lld",&l,&r);
        ll ans=0;
        for(int i=1;i<=np;i++)
        {
            for(ll num =(ll)p[i]*p[i];num<=r;num*=p[i])
            {
                if(num>=l) ans++;
            }
        }
        printf("%lld\n",ans);
    }
    return 0;
}

Solution2:
(本来以为用log(函数)代替循环会更快的 )
其实因为log()运算其实也是手工运算的模拟,而且还会计算到一定精度,当然会慢很多。
在这里插入图片描述

#include<stdio.h>
#include<iostream>
#include<cmath>
#include<math.h>
#include<string>
#include<string.h>
#include<algorithm>
#define ll long long
using namespace std;

const int maxn=1e6+10;
//欧拉筛法( O(n)  )
int np=0,p[maxn],v[maxn+10];
int gg(int n){
    for(int i=2;i<=n;i++){
        if(!v[i]) p[++np]=i;//此时的i为某个质数
        for(int j=1;j<=np && i*p[j]<=n;j++){
            v[i*p[j]]=1; //用这个合数的最小质因子去筛掉这个合数
            if(i%p[j]==0) break;
        }
    }
    return np;
}
int t;
ll l,r;
int main(){
    cin>>t;
    gg(maxn);
    while (t--)
    {
        scanf("%lld%lld",&l,&r);
        ll ans=0;
        for(int i=1;i<=np;i++)
        {
            if(p[i]>r)
                break;
            int lp = ceil(log(l)/log(p[i]));
            int rp =floor(log(r)/log(p[i]));
            if(rp<=1)
                continue;
            if(lp<=1 && p[i]*p[i]<=r)
                lp=2;
            ans+= rp-lp+1;
        }
        printf("%lld\n",ans);
    }
    return 0;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!