写在前面:
在比赛中,数论涉及到最多的就是素数了,那与之相关的算法便是唯一分解定理,欧拉筛,欧拉函数.
其次还会涉及到快速幂,矩阵快速幂,逆元,阶乘逆元,博弈,容斥原理,斐波那契
唯一分解定理
任何大于1的自然数,都可以唯一分解成有限个质数的乘积,即: n=p1^a1*p2^a2*p3^a3....pm^am
唯一分解定理通常结合"欧拉筛,因子数计算,质因子"来出题,一个很典型的例题 移步点击链接
欧拉函数
比n小,并且与n互质的正整数的个数(包括1).
欧拉函数通常涉及互质问题,对了,还有个欧拉定理:"存在正整数a,n,并且a、n互质,那么他们满足:"
而且,费马小定理就是欧拉函数中n为质数下的特例!!! 相关模板和详细 移步点击链接
欧拉筛
在大于1e8的数据范围内筛选素数,欧拉筛是明智的选择.
详情 移步点击链接
容斥原理
要计算几个集合并集的大小,我们要先将所有单个集合的大小计算出来,然后减去所有两个集合相交的部分,再加回所有三个集合相交的部分,再减去所有四个集合相交的部分,依此类推,一直计算到所有集合相交的部分。
容斥原理的应用很广,比如:方程整数解问题,指定区间内与n互质个数问题..例题 移步点击链接
博弈论
博弈的类型分很多种,算法较为灵活多变,当状态空间不大时,可以采用模拟双方策略即dfs 移步点击链接
其实更多的时候是分析,从贪心的角度去考虑 移步点击链接
循环节
特别是在涉及n很大时的取模运算,这时通常会存在循环节
斐波那契数列
在计算第n项时,如果n很大,那么会使用矩阵快速幂来进行计算
Catalan数
1,1,2,5,14,42,132,429,1430,4862,16796...有规律的序列,它有一个公式:
逆元
假设x是a的逆元,那么 a * x = 1(mod p)
我们用inv(b)来表示b的逆元,那么他一定满足(即乘法逆元):b*inv(b) = 1(mod p) ==> b = 1/inv(b) ,那么我们代入上面的除法的式子:(a/b)%p = (a * inv(b)) %p
这样我们就可以根据逆元来将除法取余的式子转换为乘法取余的式子
计算某个数的逆元的方法有费马小定理和扩展欧几里得(常用).
阶乘逆元
还真遇到过这种题,不过网上的讲解很少,目前只有模板 移步点击链接
扩展欧几里得
在求出gcd(a,b)的同时,还能计算出a*x + b*y = gcd(a,b) 的通解 x 和 y,注意到gcd(a,b) !=1无解
经常用于计算某个数的逆元 移步点击链接
简单快速幂
二分思想,快速计算,通常涉及到取模
ps:注意爆int,迭代优于递归写法
矩阵快速幂
二分思想,通常是给出递推表达式要求第n项,这时需要构造合适的矩阵,然后矩阵快速幂,也会涉及到取模
ps:重点/难点在于如何构造合适的矩阵来计算出第n项
母函数
即生成函数,常用来解决组合问题,且把组合问题的加法法则和幂级数的乘幂对应起来 移步点击链接
凸包
把给定点包围在内部的,面积最小的凸多边形,一般用Andrew算法 移步点击链接
费马小定理
假设有一质数p与整数a,使得a,p互质(即gcd(a,p)=1),那么它们满足如下关系:
这种情况下的典型应用: 其中a^(−1)就是a的逆元,利用快速幂快速求解特定情况下的逆元.
推广: ans=n^(a^b) % mod(mod为大质数) ans=n^((a^b) % (mod−1))%mod 更多详情 移步点击链接
分块
分块是一种很重要的思想,算是挺常见的.块的大小的选择很重要,一般是sqrt(n),当然具体情况具体分析
多用于打表处理 移步点击链接