考试发现逆元不会,所以决定还是学一下数论把
先来搞清几个概念(from:hzwer)
同除和同余
假设 (m) 和 (n) 是整数,且 (m) 不是 (0),则 m 整除 (n) 指的是 (n) 是 (m) 的倍
数,即存在整数 (k),使得 (n = mk)
• 记为 (m | n)
• 称 (m) 是 (n) 的一个约数
同余并记
如果 (m) 整除 (a - b),我们就说 (a) 与 (b) 模 (m) 同余并记
(a ≡ b (mod m))
素数
如果一个数 (x),没有 (1) 和 (x) 以外的数是 (x) 的约数,称 (x) 是素数(质
数)
• 比如 2,3,5,7,11 …
eg:
证明素数有无穷多个?
假设素数是有限的,假设素数只有有限的n个,最⼤的⼀个素
数是(p)。
设(q)为所有素数之积加上(1),那么,(q =(2×3×5×…×p) + 1) 不
能被所有素数整除,我们找到了一个更大的素数
素数唯一分解
若整数 (N ≥ 2),那么 (N) 一定可以唯一地表示为若干个素数的乘积。
形如
(N) (=) (p_1^{r_1}*p_2^{r_2}*…p_k^{r_k}) ((p_i) 为素数 , (r_i) ≥ 0)
最大公约数
• 两个不同时为 (0) 的数 (a) 与 (b) 的最大公因数是同时整除它们的两个最大
的数,记为 (gcd( a , b ))
• 如果 (gcd( a , b ) = 1),我们称它们互质。
• 比如 (gcd( 16 , 24 ) = 8)
快速幂 ab
• 预处理 (a_1~a_2~a_4~…~a_2n),对 (b) 做二进制拆分
• 如 (a^{21} = a^{16} * a^{4} * a^{1})
逆元(倒数)
逆元的引入是为了解决在同余意义下,无法进行除法的问题 !
也就是解决 (a / b % m) 情况
在模 (p) 意义下,(x) 的乘法逆元 (x^{p-1}) 满足如下同余方程:
(x * x^{-1} ≡ 1 (mod p))
eg:
(15 / 3 = 5 (mod 7) => (15 mod 7) * (3^{-1}) mod 7)
求逆元??
我们有:
(inv(x)⋅x ≡ 1 (mod p))
又据费马小定理:(x^{p-1} ≡ 1 (mod p))
故有:(inv(x)⋅x ≡ x^{p-1}(mod p))
两边同时除以 (x) 有:
(inv(x) ≡ x^{p-2}(mod p))
这就是模质数意义下的逆元求法
代码实现
int qmi(int a,int k,int p)
{
int res=1%p;
while(k)
{
if(k & 1)res=(ll)res*a%p;
a=(ll)a*a%p;
k>>=1;
}
return res;
}