素数判定的常用 【在线 or 离线】

来源:互联网 发布:linux安装内核开发包 编辑:程序博客网 时间:2024/06/10 12:08

常用的是 素筛打表

代码
离线算法 素筛

#include <bits/stdc++.h>using namespace std;#define inf 0x3f3f3f3fconst int MAXN = 1e7; //  *** const int MAXM = 1e6+100;const double PI = acos(-1.0);const double eps = 1e-8;inline int read(){    int x=0,f=1; char ch=getchar();    while (ch<'0'||ch>'9') { if (ch=='-') f=-1; ch=getchar(); }    while (ch>='0'&&ch<='9') { x=x*10+ch-'0'; ch=getchar(); }    return x*f;}/***********************************************/bool su[MAXN]={1,1,0};void dabiao(){  //埃及筛    for(int i=2;i*i<n;i++)        if(!su[i])            for(int j=i*i;j<n;j++)  // 从i*i开始就行            su[j]=1;}int main(){}

代码
费马定理 在线算法
代码

#include <bits/stdc++.h>using namespace std;#define inf 0x3f3f3f3fconst int maxn = 100000;const int MAXM = 1e6+100;const double PI = acos(-1.0);const double eps = 1e-8;inline int read(){    int x=0,f=1; char ch=getchar();    while (ch<'0'||ch>'9') { if (ch=='-') f=-1; ch=getchar(); }    while (ch>='0'&&ch<='9') { x=x*10+ch-'0'; ch=getchar(); }    return x*f;}/*****************************************/int pri[maxn],f[maxn],top;bool vis[maxn];int l,r,mid,n;int G(int n,int m){    if (!m) return n;    if (m==1) return n-n/2;    if (n<=maxn)    {        if (f[n]<=m) return 1;        if (f[(int)sqrt(n)]<=m) return f[n]-m+1;    }    return G(n,m-1)-G(n/pri[m],m-1);}bool pan(int x){    int y=sqrt(x);    return f[y]+G(x,f[y])-1>=n;}int main(){    for (int i=2;i<=maxn;++i)    {        if (!vis[i]) pri[++top]=i;        for (int j=1;j<=top&&pri[j]*i<=maxn;++j)        {            vis[i*pri[j]]=1;            if (i%pri[j]==0) break;        }    }    for (int i=2;i<=maxn;++i) f[i]=f[i-1]+(!vis[i]);    int k = 0;    /**************************************/    while(~scanf("%d",&n),n) {  // 前第n个素数是什么         l=1,r=300000000;    while(l<r)    {        mid=(l+r)/2;        if (pan(mid)) r=mid;        else l=mid+1;    }    printf("Case %d: %d\n",++k,l);    }}
原创粉丝点击