信息学竞赛中的数学知识小结
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
信息学竞赛中的数学知识⼩结
信息学竞赛中的数学知识简要梳理信息学竞赛经常涉及⼀些数学知识。
现在梳理⼀下。
⽬录
1组合数学:
1.1排列与组合
1.2母函数
1.3⼆项式定理
1.4容斥原理
1.5鸽巢原理
1.6群论(特别是置换群)
1.7Burnside引理与Polya定理
2线性代数:
2.1矩阵定义及运算
2.2⾼斯消元解线性⽅程组
2.3Matrix-Tree定理
3数论:
3.1扩展欧⼏⾥得
3.2逆元
3.3解模意义下⽅程
3.4莫⽐乌斯反演
3.5Miller-Rabin素数测试
3.6Pollard-Rho 因⼦分解
3.7BSGS 离散对数
4博弈论:
4.1组合游戏
4.2GS函数和GS定理
5数值运算:
5.1Simpson 启发式积分
1组合数学:
1.1排列与组合
n个不同元素,其所有排列个个数:全排列
n个不同元素,选出m个来做全排列,排列数:
n个不同元素,选出m个的组合数:
n个元素,有m种,第i种有n i个,每种则所有元素的排列数:
n种元素,每种有⽆限多个,选出r个(可重复)的⽅案数(⽤夹棍法理解):
n个不同元素,选出m个,且每个都不相邻:
1.2母函数
母函数是⼀个函数,该函数有⽆限多项,且具有下⾯的形式:
这样,⼀个母函数的的各项的系数就可以组成⼀个数列,并且任意⼀个数列都和母函数⼀⼀对应,对数列的研究就可以⽤母函数来帮忙了(还需要⽜顿⼆项式定理来推导某些特殊级数的有限多项式表⽰)。
1.3⼆项式定理
1.4容斥原理:
思想是:“统计所有的,减去多统计的,加上多减的,再减去多加的…”。
由德摩根定理:
所以:
这样,我们不光可以⽤容斥定理来统计“满⾜a,或满⾜b,或满⾜c…”的元素的个数,也可以⽤来统计“不满⾜a并且不满⾜b并且不满⾜c”的元素的个数。
1.5鸽巢原理:
将n只鸽⼦放到n-1个巢中,⾄少有⼀个巢有⼤于⼀只鸽⼦。
很显然的事情,但是⽤它的题⽬却不是那么显然,需要我们不断的强化问题(加更多⾃⼰的限制)。
我见过的⽤处是:给出n 个⾃然数,找出其中⼀堆,使得他们的和为n的倍数。
1.6群论(特别是置换群)
给定⼀个集合A和定义在上⾯的⼀种⼆元运算“*”,并满⾜:
1、封闭性
2、结合律
3、存在单位元
4、存在逆元
那么称A在运算“*”下成群。
置换群是⼀个群,它的集合A是由置换组成,运算“*”是置换的叠加。
1.7Burnside引理与Polya定理
设存在⼀个集合S,并且集合中的元素s能被⼀个置换作⽤变成,并且该置换的逆置换能把s’变成s。
由置换群可以定义⼀个在S上的等价关系:如果能通过置换群中的置换变成,那么a和b 等价。
可以证明这种关系满⾜:⾃反、对称、传递。
然后置换群G就可以将S划分出很多等价类,上⾯两个定理就是⽤来统计有多少个等价类
的。
Burnside引理的内容是:设置换群为G,等价类的个数是N,置换a将s变成a(s)
(⽅括号表⽰如果条件成⽴,就是1,不成⽴为0.)
我们将这样⼀组满⾜a(s)=s的a和s成为⼀个不动点,即s在a的作⽤下不变动。
将其表⽰成⽂字语⾔就是:“G将S划分出的等价类个数是G作⽤在S上的不动点个数除以置换数”。
Polya定理实际上就是告诉了我们⼀种求不动点个数的⽅法。
具体见《组合数学》。
2线性代数:
2.1矩阵定义及运算:(矩阵除了乘法还有加法,略)
2.2⾼斯消元解线性⽅程组
思想:先将系数矩阵变成⼀个上三⾓矩阵,然后从最后⼀⾏开始计算,开始回代。
2.3Matrix-Tree定理
这个定理是⽤来算连通⽆向图的⽣成树个数的。
算法的主要过程是先求出这个图的基尔霍夫矩阵(度数矩阵减去关联矩阵)。
然后答案就是基尔霍夫矩阵的n-1阶余⼦式的⾏列式。
⼀个⽅阵的⾏列式的值是:算出n个元素,要求每⾏每列都只有⼀个,然后将算出来的元素乘起来,将选出来的元素的位置表⽰成n个⼆元组:(i,j),这n个⼆元组组成⼀个置换,如果它是⼀个奇置换,将算出来的值乘以-1,否则不变。
所有这样选法算出来的值的和就是⾏列式的值。
对矩阵做⼀些简单的变换,⾏列式的值的变化也有⼀些规律,略。
⾏列式的求法是将矩阵变成⼀个上三⾓矩阵(⾏列式和原来⼀样),然后对⾓线的乘积就是答案。
3数论:
3.1扩展欧⼏⾥得
求出中的。
3.2逆元
求a在模m下的逆元。
如果,则存在逆元,解⽅程:
得到的x就是a在模m下的逆元。
3.3解模意义下⽅程
形式⼀:
对于形式⼀,将⽅程化简成:
设,如果,则⽅程有解,否则⽆解。
如果有解,即,可以证明:
和
同解(先把模⽅程化简成⼆元等式,然后可以发现前⾯⽅程的解也是后⾯⽅程的解,后⾯⽅程的解也是前⾯的解)。
然后解出这个⽅程(
)。
设初始解为,然后原始⽅程的d个解就是:
形式⼆:
如果这个⽅程组的所有m互质,那么就是典型的中国剩余定理,如果不互质,就采⽤⽅程合并的思想(通法)。
将两个⽅程合并:
先将⽅程变形为:
然后联⽴起来,解出,然后,然后上⾯的⽅程就等价于下⾯⼀个⽅程:
⼀直这样合并,直到化简成只有⼀个⽅程,然后就完了。
3.4莫⽐乌斯反演
先说积性函数,如果⼀个函数满⾜,当和是质数时,
则称是积性函数,如果没有质数限制,上式依然成⽴,则称为完全积性函数。
若⼀个函数是积性函数,那么可以定义其和函数:
可以证明(但我不知道),也是积性函数。
再来看两个特殊的函数,和,即Mobius函数和Euler函数,其中
可以证明这两个函数都是积性函数。
下⾯是它们的和函数:
Mobius反演就是根据和函数来求原函数,设的和函数是,那么:
这⼀堆东西有什么⽤呢?转换!如果我们在⼀堆求和式中出现了或者,那么我
们可以直接将他们看成和函数,⽤Mobius函数或Euler函数来表⽰,有时就可以达到化简的⽬的。
3.5Miller-Rabin素数测试
对于⼀个数,如何判断它是否是质数?试除法要的时间复杂度,如果给我们⼀个
64位⽆符号数,让我们判断,那么这个⽅法就不⾏了。
Miller-Rabin算法是⼀种随机算法,但只要随机次数⼀⼤,正确概率就很⼤很⼤了。
算法要⽤到两个定理:
定理⼀(费马⼩定理):如果是质数,那么对于任何正整数有:
定理⼆:如果是⼀个奇素数,那么的解是。
我们需要利⽤这两个定理的逆否命题,即“如果不这样,就不是素数”。
所以如果算法返回否,那么该数⼀定不是素数,如果返回是,则有可能是素数。
算法流程:
1、设判定的数为,特判⼀下,若是⼤于2的奇数则继续。
2、分解指数,其中尽量⼤。
3、随机取⼀个正整数作为底数。
4、依次计算底数为,的幂在模下的的
值,将这列数看成⼀个数列,最后⼀项就是。
从第⼆项开始,如果某⼀项的值是1,判断它前⾯那⼀项的值是不是模意义下的1或-1,如果不是,根据定理⼆,返回否。
5、看最后⼀项是不是1,如果不是,根据定理⼀,返回否。
执⾏8~10次基本就可以保证正确性了。
3.6Pollard-Rho 因⼦分解
这⾥只说⼀下⼤概步骤(思想?),加⼊要分解,我们维护两个序列:
其中
从头开始计算第⼀个序列,每计算完成⼀项,看(其中和是最新算出来的项)是否是的⾮平凡因⼦,当,它的复杂度和正确性分析请看《算法导论》。
3.7BSGS 离散对数
问题:给定正整数,求满⾜的。
我们知道,意思是有⼀个长度为的循环,我们可以只枚举长度为的⼀段就可以知道解或者⽆解。
但是枚举依旧吃不消,那么我们可以分块算,简单来说,就是先算长度为的那个序列个前项,
将它们放到⼀个hash表中,然后每次计算的值,计算它的逆,再计算逆与的乘积,看hash表中有没有算出来的这个值,如果有,就找到了,找完都没有那就真的没有了。
原理就是:。