欧拉函数几个性质

性质一φ(n)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…(1-1/pn)

ll eulur(ll x){//根据定义求 ll ans=x; for(ll i=2;i*i<=x;i++){ if(x%i==0){ while(x%i==0) x/=i; ans=ans*(i-1)/i; } } if(x>1) ans=ans*(x-1)/x; return ans; }


性质二:所有小于n与n互质的数字的和sum=φ(n)/2*n其中互质的数都是成对出现,并且和为n

性质三:当n是奇数时候,φ(2*n)=φ(n);

性质四:如果i%p==0&&(i/p)%p==0 那么有φ(i)=φ(i/p)*p;else φ(i)=φ(i/p)*(p-1)

因此可以通过nlogn求出最小质因数,再O(n)预处理phi

int mindiv[N],phi[N]; void init(){ for(int i=1;i<N;++i) mindiv[i]=i; for(int i=2;i*i<N;i++){ if(mindiv[i]==i){ for(int j=i*i;j<N;j+=i){ mindiv[j]=i; } } } phi[1]=1; for(int i=2;i<N;i++){ phi[i]=phi[i/mindiv[i]]; if((i/mindiv[i])%mindiv[i]==0) phi[i]=phi[i]*mindiv[i]; else phi[i]=phi[i]*(mindiv[i]-1); } }


一个很好的blog:链接讲了杜教筛,暂时不求甚解