线性筛(同时得到欧拉函数和素数表)

来源:互联网 发布:基于代理模型的优化 编辑:程序博客网 时间:2024/06/05 02:01
#include<iostream>#include<cstring>#include<cstdio>#include<string>#include<cmath>using namespace std;const int INF=0x3f3f3f3f;const int MAXN=1e7+5;const int MOD=1e9+7;bool check[MAXN];int phi[MAXN];int prime[MAXN];int tot;//素数的个数void phi_and_prime_table(int N){  memset(check,false,sizeof(check));  phi[1]=1;  tot=0;  for(int i=2;i<=N;i++)  {    if(!check[i])    {      prime[tot++]=i;      phi[i]=i-1;    }    for(int j=0;j<tot;j++)    {      if(i*prime[j]>N) break;      check[i*prime[j]]=true;      if(i%prime[j]==0)      {        phi[i*prime[j]]=phi[i]*prime[j];        break;      }else      {        phi[i*prime[j]]=phi[i]*(prime[j]-1);      }    }  }}int main(){  int n;  scanf("%d",&n );  phi_and_prime_table(n);  for(int i=1;i<=n;i++)  cout<<"i: "<<i<<"   "<<phi[i]<<endl;  cout<<"---------"<<endl;  cout<<"tot: "<<tot<<endl;  for(int i=0;i<tot;i++)  {    cout<<prime[i]<<endl;  }  return 0;}
原创粉丝点击