1~n中与n互质的数被称为欧拉函数。
怎么求欧拉函数呢 只要拿n减去与n不互质的数的个数就可以了
φ(n)=n*∏质数p|n(1-1/p)
欧拉函数的性质
1.任意n>1,1~n中与n互质的数之和为φ(n)*n/2
证明:gcd(n,x)=gcd(n,n-x) 所以与n互质的数x,n-x是成对出现的 两个数的平均值为n/2
2.若a,b互质,则φ(ab)=φ(a)φ(b)
3.若f是积性函数,且在算数基本定理中n=∏(pici) i=1~m,则f(n)=∏f(pici) i=1~m
积性函数:如果当a,b互质时,有f(ab)=f(a)*f(b),则称函数f为积性函数
4.若p|n且p2|n,则φ(n)=φ(n/p)*p
证明:由给定条件可知 n与n/p有相同的质因子只是p的指数不同
按欧拉函数的计算公式写出来φ(n)/φ(n/p) 就是p
5.若p|n且p2不能被n整除,则φ(n)=φ(n/p)*φ(p)
证明:p与n/p互质 所以φ(n)=φ(n/p)*φ(p)
若p为质数 φ(p)=p-1 即φ(n)=φ(n/p)*φ(p) φ(n)=φ(n/p)*(p-1)
板子题
#include<iostream> #include<cstdio> #include<cmath> #define Rg register #define go(i,a,b) for(Rg int i=a;i<=b;i++) using namespace std; int n,ans,phi[40010]; int el() { go(i,1,n)phi[i]=i; go(i,2,n) if(phi[i]==i) go(j,1,n/i) phi[i*j]=phi[i*j]/i*(i-1); } int main() { scanf("%d",&n); if(n==1){printf("0");return 0;} el();n--; go(i,2,n)ans+=phi[i]*2; printf("%d",ans+3); return 0; }