神奇的O(n)筛素数和求欧拉函数

来源:互联网 发布:ubuntu搭建java服务器 编辑:程序博客网 时间:2024/06/06 09:17
用最小的素因子筛掉每个数int prime[N],phi[N],cnt;// prime:记录质数,phi记录欧拉函数int Min_factor[N];// i的最小素因子bool vis[N];void Init(){    cnt=0;    phi[1]=1;    int x;    for(int i=2;i<N;i++)    {        if(!vis[i])        {            prime[++cnt]=i;            phi[i]=i-1;            Min_factor[i]=i;        }        for(int k=1;k<=cnt&&prime[k]*i<N;k++)        {            x=prime[k]*i;            vis[x]=true;            Min_factor[x]=prime[k];            if(i%prime[k]==0)            {                phi[x]=phi[i]*prime[k];                break;            }            else phi[x]=phi[i]*(prime[k]-1);        }    }}