第四章 数学知识(二)
如无特殊说明,所有数均为正整数.
欧拉函数
-
互质:若 g c d ( a , b ) = 1 gcd(a,b)=1 gcd(a,b)=1 则称 a , b a,b a,b 互质.
-
欧拉函数的定义:
1 ∼ N 1∼N 1∼N 中与 N N N 互质的数的个数被称为欧拉函数,记为 φ ( N ) \varphi(N) φ(N).
若在算数基本定理中, N = P 1 a 1 P 2 a 2 ⋯ P m a m N=P_1^{a_1}P_2^{a_2}\cdots P_m^{a_m} N=P1a1P2a2⋯Pmam,则: φ ( N ) = N × P 1 − 1 P 1 × P 2 − 1 P 2 × ⋯ × P m − 1 P m \varphi(N) = N \times \frac{P_1-1}{P_1} \times \frac{P_2-1}{P_2} \times\cdots \times \frac{P_m-1}{P_m} φ(N)=N×P1P1−1×P2P2−1×⋯×PmPm−1.
- φ ( N ) = N × P 1 − 1 P 1 × P 2 − 1 P 2 × ⋯ × P m − 1 P m \varphi(N) = N \times \frac{P_1-1}{P_1} \times \frac{P_2-1}{P_2} \times\cdots \times \frac{P_m-1}{P_m} φ(N)=N×P1P1−1×P2P2−1×⋯×PmPm−1.
例: 1 ∼ 6 1\sim 6 1∼6 中与 6 6 6 互质的数有 1 , 5 1,5 1,5,则 φ ( 6 ) = 6 ( 1 − 1 2 ) ( 1 − 1 3 ) = 2 \varphi(6)=6(1-\frac{1}{2})(1-\frac{1}{3})=2 φ(6)=6(1−21)(1−31)=2.
证明:利用 容斥原理, N N N 的质因子只有 P 1 ∼ P k P_1 \sim P_k P1∼Pk 这 k k k 个.
① ① ① 从 1 ∼ N 1 \sim N 1∼N 中去掉 P 1 ∼ P k P_1 \sim P_k P1∼Pk 的所有倍数,即 N − N P 1 − N P 2 − ⋯ − N P k N-\frac{N}{P_1}-\frac{N}{P_2}- \cdots - \frac{N}{P_k} N−P1N−P2N−⋯−PkN,这里面就会多去掉了一部分,比如一些数即是 P 1 P_1 P1 的倍数,也是 P 2 P_2 P2 的倍数;
② ② ② 加上所有 P i P j P_iP_j PiPj 的倍数( i , j i,j i,j 都是 1 ∼ k 1 \sim k 1∼k 中任选的两个数, i ≠ j i\not=j i=j),即 + N P 1 P 2 + N P 1 P 3 + ⋯ +\frac{N}{P_1P_2}+\frac{N}{P_1P_3}+\cdots +P1P2N+P1P3N+⋯,但如果一个数是 P 1 , P 2 , P 3 P_1,P_2,P_3 P1,P2,P3 的倍数,它会被去掉三次,而它会被 P 1 P 2 , P 1 P 3 , P 2 P 3 P_1P_2,P_1P_3,P_2P_3 P1P2,P1P3,P2P3 加上三次,效果是没有减没有加,但其实这个数应该被去掉;
③ ③ ③ 减去所有 P i P j P k P_iP_jP_k PiPjPk 的倍数,即 − N P 1 P 2 P 3 − N P 1 P 2 P 4 − ⋯ -\frac{N}{P_1P_2P_3}-\frac{N}{P_1P_2P_4}-\cdots −P1P2P3N−P1P2P4N−⋯,随后依次类推 + N P 1 P 2 P 3 P 4 + ⋯ − N P 1 P 2 P 3 P 4 P 5 − ⋯ +\frac{N}{P_1P_2P_3P_4}+\cdots - \frac{N}{P_1P_2P_3P_4P_5}- \cdots +P1P2P3P4N+⋯−P1P2P3P4P5N−⋯.这样,实际上公式的展开就是证明的过程中得到的各项,每项都可以提出来一个 N N N;
通过验证各项系数来推导正确性:
N P 1 \frac{N}{P_1} P1N 的系数为第一个括号内选 − 1 P 1 -\frac{1}{P_1} −P11,其余括号内选 1 1 1,得 − N P 1 -\frac{N}{P_1} −P1N;
N P 1 P 2 \frac{N}{P_1P_2} P1P2N 的系数为第一个括号内选 − 1 P 1 -\frac{1}{P_1} −P11,第二个括号内选 − N P 2 -\frac{N}{P_2} −P2N,其余括号内选 1 1 1,可以得到 + N P 1 P 2 +\frac{N}{P_1P_2} +P1P2N;
以此类推,即可得证.
AcWing 873. 欧拉函数
给定 n n n 个正整数 a i a_i ai,请你求出每个数的欧拉函数。
输入格式
第一行包含整数 n n n。
接下来 n n n 行,每行包含一个正整数 a i a_i ai。
输出格式
输出共 n n n 行,每行输出一个正整数 a i a_i ai 的欧拉函数。
数据范围
1 ≤ n ≤ 100 1≤n≤100 1≤n≤100,
1 ≤ a i ≤ 2 × 1 0 9 1≤a_i≤2×10^9 1≤ai≤2×109
输入样例:
3
3
6
8
输出样例:
2
2
4
时/空限制: 1s / 64MB
来源: 模板题
算法标签:数学知识
欧拉函数
yxc’s Solution
- 直接使用公式来求.
- 时间复杂度为 O ( n ) O(\sqrt n) O(n).
因为想要得到的是整除的结果,所以将 ( 1 − 1 P ) (1-\frac{1}{P}) (1−P1) 通分为 ( P − 1 ) / P (P-1)/P (P−1)/P,先进行乘法运算会导致溢出,所以代码中先进行除法运算.
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int n,a;
scanf("%d",&n);
while(n--){
scanf("%d",&a);
int res=a;
for(int i=2;i<=a/i;++i)
if(a%i==0){
res=res/i*(i-1);
while(a%i==0) a/=i;
}
if(a>1) res=res/a*(a-1);
printf("%d\n",res);
}
return 0;
}
AcWing 874. 筛法求欧拉函数
给定一个正整数 n n n,求 1 ∼ n 1∼n 1∼n 中每个数的欧拉函数之和。
输入格式
共一行,包含一个整数 n n n。
输出格式
共一行,包含一个整数,表示 1 ∼ n 1∼n 1∼n 中每个数的欧拉函数之和。
数据范围
1 ≤ n ≤ 1 0 6 1≤n≤10^6 1≤n≤106
输入样例:
6
输出样例:
12
时/空限制: 1s / 64MB
来源: 模板题
算法标签:数学知识
欧拉函数
线性筛法
yxc’s Solution
- 如果每个数都用公式来做,则时间复杂度会达到 O ( n n ) O(n\sqrt n) O(nn),是不理想的.
- 借用线性筛法求素数的代码,可以达到 O ( n ) O(n) O(n) 的时间复杂度求每个数的欧拉函数的效果.
for(int i=2;i<=n;++i){
if(!st[i]) primes[cnt++]=i;
for(int j=0;primes[j]<=n/i;++j){
st[primes[j]*i]=true;
if(i%primes[j]==0) break;
}
线性筛法这个代码是很好用的,它能顺便求出来很多东西,不光可以求欧拉函数.
-
根据数据范围 1 ≤ n ≤ 1 0 6 1≤n≤10^6 1≤n≤106,则欧拉函数的和可能会很大(达到越 n 2 n^2 n2 的数量级),所以答案应该用
long long
存储; -
如果一个数 P P P 是质数,则它的欧拉函数应为 P − 1 P-1 P−1,即 1 ∼ P − 1 1 \sim P-1 1∼P−1 都与其互质;
-
当
i%primes[j]==0
时, ϕ ( \phi( ϕ(i*primes[j]
) ) ) 应该为多少?- 从公式的角度有
primes[j]
是i
的一个质因子,所以 ϕ ( \phi( ϕ(i
) ) ) 已经乘过 ( 1 − 1 p r i m e s [ j ] ) (1-\frac{1}{primes[j]}) (1−primes[j]1) 了,所以 φ ( \varphi( φ(i
) ) ) 中形如的 ( 1 − 1 P ) (1-\frac{1}{P}) (1−P1) 的式子和 φ ( \varphi( φ(i*primes[j]
) ) ) 中是一模一样的.
或者从分解质因数的角度,
i*primes[j]
分解质因数后的结果只是比i
多乘了一个primes[j]
,故不考虑指数的情况下,i*primes[j]
和i
的质因子是相同的.- 即,假设 φ ( \varphi( φ(
i
) = i × ( 1 − 1 P 1 ) × ⋯ × ( 1 − 1 P k ) )=i\times (1-\frac{1}{P_1})\times \cdots \tim
- 从公式的角度有