欧拉线性筛

来源:互联网 发布:获取svn数据java接口 编辑:程序博客网 时间:2024/06/06 15:44

对于线性筛素数的增添,可以同时求出每个数的欧拉函数
首先需要三个性质
证明链接(转)
性质一:若p为质数,phi[p]=p-1(显然)
性质二:若 i mod p=0(p为质数),那么有phi[i*p]=p*phi[i]
性质三:若 i mod p≠0(p为质数),那么phi[i*p]=phi[i]*(p-1)

#include <cstdio>#include <iostream>using namespace std;const int N=40000;int phi[N+10],prime[N+10];int tot,ans;int mark[N+10];void getphi(){    phi[1]=1;    for(int i=2;i<=N;i++)     {        if(!mark[i])        {            prime[++tot]=i;            phi[i]=i-1;//性质1        }        for(int j=1;j<=tot&&i*prime[j]<=N;j++)        {            mark[i*prime[j]]=1;            if(!(i%prime[j]))             {                phi[i*prime[j]]=phi[i]*prime[j];//性质2                break;             }            else             phi[i*prime[j]]=phi[i]*(prime[j]-1);//性质3        }     }}int main(){    getphi();    printf("%d",phi[8]);//1,3,5,7与8互质     return 0;}
原创粉丝点击