数论全家桶

数论

同余

同余式可以同乘、同加减(记得加上模数)

	(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 的数论考得不是很深。

 

posted @ 2020-10-30 22:03  钠浮游  阅读(90)  评论(0)    收藏  举报