内容较多,建议使用目录
文章转自最哥的博客:点击打开链接
容斥原理
集合的并集
设
A1,A2...,An
是有限集合,则
|A1⋃A2⋃…⋃An|=∑ni=1|Ai|−∑ni=1∑j>i|Ai⋂Aj|−∑ni=1∑j>i∑k>j|Ai⋂Aj⋂Ak|…+(−1)n|A1⋂A2⋂…⋂An|
Sylvester公式
给定集合N和具有性质i的集合
A1,A2...,An
,则
|A¯¯¯1⋂A¯¯¯2⋂…⋂A¯¯¯n|=|N|−(∑ni=1|Ai|−∑ni=1∑j>i|Ai⋂Aj|…+(−1)n|A1⋂A2⋂…⋂An|)
[列题] 区间(S,E]中与n互质的元素个数
设 Ai 为n的第i个质因子 pi 的倍数的集合且 Ai⊆(S,E],i=1,2,3…k ,那么 |Ai|=[Epi]−[Spi],|Ai⋂Aj|=[Epipj]−[Spipj]… ,然后套用上面公式即可解决问题了。关键是将这个公式表达出来,有没有发现一共有 2n 项多项式,而且组合数量为奇数时负,组合数量为偶数时符号为正。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
欧拉函数φ(n)
欧拉函数φ(n) 是小于等于n且与n互素的正整数的个数,假设
n=pα11pα22pα33…pαkk
,则有
证明:
设
Ai
为1到n之间
pi
的倍数的集合,i=1,2,3,…,k,则
φ(n)=
|A¯¯¯1⋂A¯¯¯2⋂…⋂A¯¯¯k|
=
|N|−(∑ki=1|Ai|−∑ki=1∑j>i|Ai⋂Aj|…+(−1)k|A1⋂A2⋂…⋂Ak|)
=
n−(∑ki=1npi−∑ki=1∑j>inpipj+∑ki=1∑j>i∑h>jnpipjph…+(−1)knp1p2p3…pk)
=
n(1−1p1)(1−1p2)(1−1p3)…(1−1pk)
性质:
- 欧拉函数是积性函数,即是说若m,n互质 φ(mn)=φ(m)φ(n) 。
- 若n是质数p的k次幂, φ(n)=φ(pk)=pk−pk−1=(p−1)pk−1 ,因为除了p的倍数外,其他数都跟n互质。
欧拉函数φ(n) c++实现代码:
我们为了方便根据以上性质将其变形得到
如此便可写出φ(n)的 o(n√) 的代码了。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
欧拉函数值表筛法
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
[列1]区间[1,n]与n的最大公约数的和
[列2]
UVA11426 求 ∑ni=1∑nj=i+1gcd(i,j)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
[列3]
[1,n]与n互素的和
莫比乌斯函数
莫比乌斯函数 μ(n) ,在狄利克雷卷积的乘法中与恒等函数互为逆元, μ(1)=1 ,对于无平方因子数 n=∏ti=1pi 有 μ(n)=(−1)t ,对于有平方因子数 n 有 μ(n)=0 。
o(n√) 的板子
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
同余
两个整数 a,b,若它们除以正整数 m所得的余数相等,则称 a,b对于模 m同余,记作 a≡b(modm)
其性质这里不赘述了,可以参看 维基
费马小定理
费马小定理是数论中的一个定理:假如a是一个整数,p是一个质数,那么
ap−a
是p的倍数,可以表示为
如果a不是p的倍数,这个定理也可以写成
[列题]计算 2100 除以13的余数
2100≡212×8+4(mod13)≡(212)8⋅24(mod13)≡18⋅16(mod13)≡16(mod13)≡3(mod13)
则答案为3
欧拉定理
若 gcd(a,n)=1 ,则
扩展欧几里得算法
给予二整数a、b,必存在有整数x、y使得ax + by = gcd(a,b)
对于这个问题,扩展欧几里得算法能够快速解出使上式成立(x,y),复杂度o(log(n))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
通过上面代码可以得到一组特解,记为 (x0,y0) ,那么通解可以表示为
例题 POJ1061
模逆元
若 a⋅b≡1(mod m) ,称a和b对于模数m来说互为逆元
定理:a存在模m的乘法逆元的充要条件是gcd(a,m) = 1
证明:
- 充分性:由欧拉定理知 aφ(m)≡1(mod m) ,那么必有 b=aφ(m)−1 使 a⋅b≡1(mod m)
- 必要性:既然 a⋅b≡1(mod m) ,即有 a⋅b−m⋅k=1=k′⋅gcd(a,m),k∈Z,k′∈Z 成立,即有 gcd(a,m)=1
[例] 已知 a, m, 求b
将定义式改写成
a⋅b−1=m⋅k,k∈Z⇒a⋅b−m⋅k=1,k∈Z
利用扩展欧几里得算法不难求得一组解
(b′,k′)
使得
a⋅b′+m⋅k′=gcd(a,m)
结合定理得
若
gcd(a,m)≠1
,那么b无解
若
gcd(a,m)=1
,那么
b=b′gcd(a,m)=b′
代码
那么也能写出代码了,若无答案返回-1,若有返回最小的正解
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
o(n)得出[1,n]的(mod p)逆元
该算法要求所mod p为素数且n< p,记
a
的逆元表示为
a−1
设
k=p%i
,假设以求得
k−1(modp)
,则
i⋅i−1≡k⋅k−1≡1(modp)
⇒i⋅i−1≡(p%i)⋅(p%i)−1(modp)
⇒i⋅i−1≡(p−[p/i]⋅i)⋅(p%i)−1(modp)
⇒i⋅i−1≡((i−1)⋅p+p−[p/i]⋅i)⋅(p%i)−1(modp)
⇒i⋅i−1≡i⋅(p−[p/i])⋅(p%i)−1(modp)
由于p为素数,则
gcd(i,p)=1
,则
i−1≡(p−[p/i])⋅(p%i)−1(modp)
取[0,p)中的解
i−1=(p−[p/i])⋅(p%i)−1%p
代码为
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
孙子定理(中国剩余定理)
用现代数学的语言来说明的话,中国剩余定理给出了以下的一元线性同余方程组:
有解的判定条件,并用构造法给出了在有解情况下解的具体形式。
中国剩余定理说明:假设整数 m1,m2,...,mn 其中任两数互质,则对任意的整数: a1,...,an ,方程组 (S) 有解,并且通解可以用如下方式构造得到:
- 设 M=m1×m2×⋯×mn=∏i=1nmi 是整数 m1,m2,...,mn 的乘积,并设 Mi=M/mi,∀i∈{1,2,⋯,n} ,即 Mi 是除了 mi 以外的n − 1个整数的乘积。
- 设 ti=M−1i 模 mi 的逆元: tiMi≡1(modmi),∀i∈{1,2,⋯,n} 。
- 方程组
(S)
的通解形式为:
x=a1t1M1+a2t2M2+⋯+antnMn+kM=kM+∑ni=1aitiMi,k∈Z.
在模
M
的意义下,方程组
(S)
只有一个解:
x=∑i=1naitiMi.
证明
对于 ∀j∈{1,2,⋯,n},j≠i,gcd(mi,mj)=1
考察乘积 aitiMi 可知:
aitiMi≡ai⋅1≡ai(modmi),
∀j∈{1,2,⋯,n},j≠i,aitiMi≡0(modmj).
所以 x=a1t1M1+a2t2M2+⋯+antnMn 满足:
∀i∈{1,2,⋯,n},x=aitiMi+∑j≠iajtjMj≡ai+∑j≠i0≡ai(modmi).
到此以得证 (S) 的一个解 x=∑ni=1aitiMi.
通解
假设 x1 和 x2 都是方程组 (S) 的解,那么:
∀i∈{1,2,⋯,n},x1−x2≡0(modmi). ,即 ∀mi|x1−x2
即 ∏ni=1mi|x1−x2 ,即 M|x1−x2
到此说明方程组
(S)
的任何两个解之间必然相差
M
的整数倍,则通解可表示为
代码
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
矩阵
数学上,一个m×n的矩阵是一个由m行n列元素排列成的矩形阵列。矩阵里的元素可以是数字、符号或数学式。
大小相同(行数列数都相同)的矩阵之间可以相互加减,具体是对每个位置上的元素做加减法。矩阵的乘法则较为复杂。两个矩阵可以相乘,当且仅当第一个矩阵的列数等于第二个矩阵的行数。矩阵的乘法满足结合律和分配律,但不满足交换律。
矩阵乘法
矩阵相乘最重要的方法是一般矩阵乘积。它只有在第一个矩阵的列数(column)和第二个矩阵的行数(row)相同时才有定义。一般单指矩阵乘积时,指的便是一般矩阵乘积。若A为
m×n
矩阵,B为
n×p
矩阵,则他们的乘积AB(有时记做A · B)会是一个
m×p
矩阵。其乘积矩阵的元素如下面式子得出:
矩阵快速幂
类比快速幂不难的到矩阵快速幂,若有矩阵a,则求 an 代码如下
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
线性递推关系与矩阵乘法
设数列
{hn}
满足
k
阶常系数线性递推关系:
bn 可以为常数,也可以是关于n的函数
若
bn
为常数,则构造转移矩阵
与初始向量
易见
事实上我们可以发现,对于任意的 k 阶常系数线性递推关系,我们总可以构造一个 k×k 或 (k+1)×(k+1) 的转移矩阵 M, 对于初始值向量
使得 Y=Mn−k+1X,Y 第一行第一列的元素恰好为 hn 。
利用矩阵乘法计算递推数列的某一项代码
使用上面的两个知识点就不难敲出代码了
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
例题 51NOD 1126
《挑战》上的矩阵快速幂模板
以斐波那契数列第n项为例
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
其他
约数个数
仍何一个整数n都可以表示成
n=pa11pa22...pakk
,那么,n的约数个数
例题 LOJ1341
a的k次幂前n位数
用该方法要注意精度
例题 LOJ1282
定积分
Simpson`s 3/8 rule
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
例题 地狱飞龙
线性筛法筛素数、莫比乌斯函数、欧拉函数
线性筛法(欧拉筛法)可以在 O(n) 的时间内获得 [1,n] 的所有素数。算法保证每个合数都会被它的最小质因子筛掉,所以复杂度是线性的。同时,我们可以利用这一特性,结合积性函数的性质,在 O(n)的时间内筛出一些积性函数的值。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28