算法基础课——第四章 数学知识(二)

image-20210807031457384

第四章 数学知识(二)


如无特殊说明,所有数均为正整数.


欧拉函数


  • 互质:若 g c d ( a , b ) = 1 gcd(a,b)=1 gcd(a,b)=1​ 则称 a , b a,b a,b​​​ 互质.

  • 欧拉函数的定义

1 ∼ N 1∼N 1N​ 中与 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=P1a1P2a2Pmam​,则: φ ( 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×P1P11×P2P21××PmPm1.​​

  • φ ( 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×P1P11×P2P21××PmPm1.

1 ∼ 6 1\sim 6 16 中与 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(121)(131)=2.​

证明:利用 容斥原理 N N N 的质因子只有 P 1 ∼ P k P_1 \sim P_k P1Pk k k k 个.

① ① 1 ∼ N 1 \sim N 1N 中去掉 P 1 ∼ P k P_1 \sim P_k P1Pk 的所有倍数,即 N − N P 1 − N P 2 − ⋯ − N P k N-\frac{N}{P_1}-\frac{N}{P_2}- \cdots - \frac{N}{P_k} NP1NP2NPkN,这里面就会多去掉了一部分,比如一些数即是 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 1k 中任选的两个数, 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 P1P2P3NP1P2P4N,随后依次类推 + 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 1n100,
1 ≤ a i ≤ 2 × 1 0 9 1≤a_i≤2×10^9 1ai2×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}) (1P1)​ 通分为 ( P − 1 ) / P (P-1)/P (P1)/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 1n 中每个数的欧拉函数之和。

输入格式

共一行,包含一个整数 n n n

输出格式

共一行,包含一个整数,表示 1 ∼ n 1∼n 1n 中每个数的欧拉函数之和。

数据范围

1 ≤ n ≤ 1 0 6 1≤n≤10^6 1n106

输入样例:

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 1n106,则欧拉函数的和可能会很大(达到越 n 2 n^2 n2 的数量级),所以答案应该用 long long 存储;

  • 如果一个数 P P P​ 是质数,则它的欧拉函数应为 P − 1 P-1 P1,即 1 ∼ P − 1 1 \sim P-1 1P1 都与其互质;

  • 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]}) (1primes[j]1) 了,所以 φ ( \varphi( φ(i ) ) ) 中形如的 ( 1 − 1 P ) (1-\frac{1}{P}) (1P1) 的式子和 φ ( \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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值