素数筛的整合(传统做法,埃拉托斯特尼筛法,欧拉筛法,玄学法)

题目——luogu3383


一、传统做法
时间复杂度:n*sqrt(n)

bool is_prime(int x){
    if(x==1) return 0;
    for(int i=2;i*i<=x;i++)
        if(x%i==0)
            return 0;
    return 1;
}


二、埃拉托斯特尼筛法
o(nloglogn)

#include
#include
#include
#include
#include
using namespace std;
int n,m,a;
bool p[10000005];
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++) p[i]=1;
    p[0]=p[1]=0;
    for(int i=1;i<=n;i++)
    {
    	if(p[i])
    	{
    		for(int j=i*2;j<=n;j+=i)
    		{
    			p[j]=0;
			}
		}
	}
    while(m--)
    {
        cin>>a;
        if(p[a]) cout<<"Yes"<<endl;
	    else  cout<<"No"<<endl;
    }
}

素数筛的整合(传统做法,埃拉托斯特尼筛法,欧拉筛法,玄学法)_第1张图片


三、欧拉筛法
o(n)

#include
#include
#include
#include
#include
using namespace std;
int n,m,a;
int p[10000005];
bool flag[10000005];
int cnt=0;
int main()
{
    cin>>n>>m;
    for(int i=2;i<=n;i++)
    {
    	if(!flag[i]) p[cnt++]=i;
    	for(int j=0;j<cnt&&i*p[j]<=n;j++)
    	{
    		flag[i*p[j]]=1;
    		if(i%p[j]==0) break;
		}
	}
    while(m--)
    {
        cin>>a;
        int l=0,r=cnt-1;
        while(l<r)
        {
        	int mid=(l+r)>>1;
        	if(a<=p[mid]) r=mid;
        	else l=mid+1;
		}
		if(p[l]==a) cout<<"Yes"<<endl;
	    else  cout<<"No"<<endl;
    }
}

素数筛的整合(传统做法,埃拉托斯特尼筛法,欧拉筛法,玄学法)_第2张图片


四、玄学法(不知道该起什么名字)
时间复杂度:???

#include
#include
#include
#include
#include
using namespace std;
int n,m,a;
bool is_prime(int x)
{
    if(x==1) return 0;
    if(x==2 || x==3) return 1;
    if(x%6!=1&&x%6!=5) return 0;
    for(int i=5;i<=sqrt(x);i+=6)
    {
        if((x%i==0&&x!=i) || (x%(i+2)==0&&x!=(i+2))) return 0;
    }
	return 1;
}
int main()
{
    cin>>n>>m;
    while(m--)
    {
        cin>>a;
        if(is_prime(a)) cout<<"Yes"<<endl;
        else if(!is_prime(a)) cout<<"No"<<endl;
    }
}

跑得飞快
素数筛的整合(传统做法,埃拉托斯特尼筛法,欧拉筛法,玄学法)_第3张图片

你可能感兴趣的:(心路历程)