定义
欧拉函数即 φ(n),表示的是小于等于 n 和 n 互质的数的个数。
φ(1)=1。当 n 是质数的时候,有 φ(n)=n−1。
性质
欧拉函数是积性函数。
n=∑d∣nφ(d) 。
$ \varphi(n) = n \prod (1 - \frac{1}{p_i}) $。
单点计算
UVA10179 Irreducable Basic Fractions
本题由于 n 范围极大,需要单点计算。
int phi(int n) { int ans=n; for(int i=2;i*i<=n;i++){ if(n%i==0) { ans=ans/i*(i-1); while(n%i==0)n/=i; } } if(n>1)ans=ans/n*(n-1); return ans; }
|
O(N) 批量计算
洛谷 P2398 GCD SUM
i=1∑nj=1∑ngcd(i,j)
=i=1∑nj=1∑nd∣gcd(i,j)∑ϕ(d)
=i=1∑nj=1∑nd∣i,d∣j∑ϕ(d)
=i=1∑nj=1∑nd=1∑nϕ(d)[d∣i][d∣j]
=d=1∑nϕ(d)i=1∑nj=1∑n[d∣i][d∣j]
=d=1∑nϕ(d)⌊dn⌋2
int n,isp[N],phi[N]; vector<int> primes; void get_phi(){ for(int i=2;i<=n;i++)isp[i]=1; phi[1]=1; for(int i=2;i<=n;i++){ if(isp[i]){ primes.push_back(i); phi[i]=i-1; } for(int p:primes){ if(i*p>n)break; isp[i*p]=0; if(i%p==0){ phi[i*p]=phi[i]*p; break; }else{ phi[i*p]=phi[i]*phi[p]; } } } }
|
这是线性筛法求欧拉函数,在用线性筛法找出每个数的最小质因数的同时,利用欧拉函数的积性性质,递推出每个数的欧拉函数值。
时间复杂度 O(n) 。
一些题目
洛谷P2215 莎拉公主的困惑
题意:求 [1,N!] 中与 M! 互质的数的个数。答案模质数 R 。M<N<107 。
由 gcd(a,b)=gcd(a,b+ka),可知
ans=m!n!φ(m!)
=m!n!×m!p是m的质因子∏pp−1
=n!p∈P∏mpp∈P∏m(p−1)
然而 p∈P∏mp 可能包含因子 R ,此时其逆元不存在,但 n! 也必然有因子 R,故需要同时约去一个 R 之后可以正确计算。若 N≥R 且 M<R 则 ans=0 。
本题由于空间限制不能 #define int long long,需要在涉及乘法运算的时候加上 1LL * ... 来避免溢出。
submission
欧拉定理