数论全家桶
数论
同余
同余式可以同乘、同加减(记得加上模数)
(a*b) %mod == (a%mod) * (b%mod); (a+b) %mod == ((a%mod) + (b%mod)) %mod; (a-b+mod) %mod == (a%mod - b%mod + mod) %mod;
指数幂同余式可以左右拆(模数为质数)
同余式不可以除,不可以随便取模。
在模意义下定义的除运算是求逆元。
根据同余式可以同乘的性质,a / b 就可以在同余式中表示为 a * b的逆元
逆元的做法:
若模数为质数,可以直接费马小定理求解快速幂 log
若模数不为质数,可以扩展欧几里得求gcd。不论用哪种方法,a在模 p 意义下的逆元存在的充要条件就是 a p 互质。
可以通过求解同余方程 ax + py == 1 来做,此时要求gcd(a,p)==1
逆元可以在线性时间内求出一整组。做法是将待求的逆元写成模数模它的形式,然后用前面的推出后面的逆元
阶乘的逆元也一样,可以用来做组合数。
逆元可以有理数取余,在期望题里面常出现,会用各种数据结构维护
扩展欧拉定理是用来求解线性同余方程的东西
做法是类似数学归纳法的形式,用前面的解来推出后面的解。柿子很好推。
扩欧出解的 min 是两系数的 gcd 。若方程有解则常数项必整除 gcd,这是判断的方式。
若两数互质,则不论常数项为多少都必定有解。
同余方程若有解则必有无穷多解,构造解的方式就是前面加一点后面减一点,柿子很好推。
一般解出来两个解都有负解,若求逆元等情况要求正整数解可以用模再加再模的方式。
C++ 里面的取模是向绝对值逼近,上述方法可以处理 ans 为负数的情况。
同余方程组( CRT )
构造解的方法很弱智……就是无脑乘然后做逆元就可以了。
在模所有模数积的意义下有唯一解。
不互质的方式就是求解 n 次exgcd 。
本质就是把上几个方程的解求出来之后,再构造它让它满足当前的方程。
BSGS
利用次幂的同余特征,求解高次同余方程。
有点像分块大段维护小块暴力的思想
首先把前面的小的解出来,然后方程两边同时跑循环检验是否有解,这个过程可以用 hash 来加速。
正确性保证是次幂模p的指数循环节(费马小定理)
要注意边界情况的判断。
矩阵
矩阵可以用来加速数列递推(配合快速幂)
广义定义的矩阵(满足结合律)可以在 log 的时间内处理很多 n 才能做到的事情(动态dp)
矩阵可以用数据结构维护,但维护的时候一定要注意方向,因为矩阵不满足交换律。
矩阵运算也有不小的常数,无比算到时间复杂度内。
邻接矩阵快速幂很有意思
tg 的数论考得不是很深。

浙公网安备 33010602011771号