记录一些结论作为备忘可以时常翻翻。
模意义下的数和运算
模相关简单运算
对于整数 a,b,满足 b>0,那么存在唯一的整数 q,r,满足 a=bq+r,其中 0≤r<b。在这之中,我们称 q 为商、r 为余数。
余数使用 amodb 或者 a%b 表示
一下是一些常见的有关模的运算:
- (a+b)modM=(amodM+bmodM)modM
- (a−b)modM=(amodM−bmodM)modM
- (a×b)modM=(amodM×bmodM)modM
注意到除法并不适用,下文会引出乘法逆元解决模意义下的除法运算。
同余
如果两数 x,y 除以 b 的余数相等,那么称 x,y 模 b 同余,记作 x≡y(modb)。
以下性质显然:
- 反身性:x≡x(modM)
- 对称性:x≡y(modM),则 y≡x(modM)
- 传递性:x≡y(modM),y≡z(modM),则 x≡z(modM)
根据我们刚刚提到的模意义下的运算规律,还可以得到以下性质:
- 同加性:若 x≡y(modM),则 x+z≡y+z(modM)
- 同乘性:若 x≡y(modM),则 x×z≡y×z(modM)
- 同幂性:若 x≡y(modM),则 xn≡yn(modM)
下面这条性质非常重要:
x≡y(modb)⇔b∣(x−y)
同余方程和裴蜀定理
裴蜀定理
在 OI 中,形如 ax+by=c 的二元一次不定方程只需要解决 a,b,c 都是整数的情况。
对于整数 a,b,设他们的最大公约数 gcd(a,b)=d,一定存在一组整数 (x,y) 使得 ax+by=d。
对于整数 a,b,c,ax+by=c 有整数解当且仅当 gcd(a,b)∣c。
扩展欧几里得算法
欧几里得算法求 a,b 最大值的过程:
- 当 b=0 时,a,b 的最大公约数就是 a
- 求出 b,amodb 的最大公约数,设为 g0
- 令 g=g0,g 就是 a,b 的最大公约数
仿照欧几里得算法求解不定方程的过程:
- 当 b=0 时,ax+by=d 的解是 x=ad,∀y。
- 求出 bx+(amodb)y=d 的一组解,设为 (x0,y0)。
- 令 (x,y)=f((x0,y0)),(x,y) 就是 ax+by=d 的一组解。其中 f((a,b)) 指将 (a,b) 这一对数进行变换。
变化如下:令 (x,y)=(y0,x0−⌊ba⌋y0)。
可以发现,设 ax+by=d=k×gcd(a,b),那么每次迭代的得到的解都是在求解 ax+by=gcd(a,b) 时得到的解的 k 倍,所以不管 d 取多少,最后的迭代中取 x=k,y=0 是没有问题的。
C++ Template:
<template typename T>
T exgcd(T a, T b, T &x, T &y) {
if (b == 0) {
x = 1, y = 0;
return a;
}
T d = exgcd(b, a % b, y, x);
y -= a / b * x;
return d;
}
乘法逆元
若 ax≡1(modp),则称 x 为 a 在模 p 意义下的乘法逆元,记为 a−1(modp)
注意,在 [0,p) 这一范围内,模 p 的逆元(若存在)是唯一的。
求解乘法逆元的方法有两种:
扩欧求解乘法逆元
容易发现乘法逆元的定义式和 ∃y,ax+py=1 等价。这也就是一个关于 a,p 的不定方程,使用扩欧解决,又裴蜀定理易得,存在 a 在模 p 意义下的逆元当且仅当 gcd(a,p)=1,a⊥b。
C++ Template:
<template typename T>
T exgcd(T a, T b, T &x, T &y) {
...
}
T inv(int a, int p) {
int x, y;
exgcd(a, p, x, y);
return x;
}
费马小定理求解乘法逆元
费马小定理定义如下:
若 ∀p∈P,且 a 不是 p 的倍数,则 ap−1≡1(modp)。
假设 p 是质数,可知如果 a 不是 p 的倍数,有 a×ap−2=ap−1≡1(modp)。所以 a 在模 p 意义下的乘法逆元就是 ap−2,可以使用快速幂解决。
C++ Template:
<template typename T>
T expow(T a, T b, const T p) {
T res = 1;
for (; b; b >>= 1) {
if (b & 1)
res = 1ll * res * a % p;
a = 1ll * a * a % p;
}
return res;
}
T inv(T a, T p) {
return expow(a, p - 2, p);
}
同余方程与中国剩余定理
中国剩余定理
一般而言,中国剩余定理用来解决这样的一类同余方程组:
⎩⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎧x≡a1(modm1)x≡a2(modm2)⋮x≡an(modmn)
其中,m1,m2,…,mn 两两互质,则对于任意整数 a1,a2,…,an,上面这个方程组有解。
解决方法如下:
- 设 M=∏i=1nmi
- 设 Mi=miM
- 设 ti=Mi−1 为 Mimodmi 的逆元(因为 Mi 和 mi 互质,所以逆元一定存在)
- x 的通解即为 x=∑i=1naitiMi+kM,k∈Z
扩展中国剩余定理
问题格式同上,但是没有了 m1,m2,…,mn 两两互质的条件。
引入定理:如果有特解 x∗,那么对于
{x≡r1(modm1)x≡r2(modm2)
的通解是 x∗+k×lcm(m1,m2),也就是 x≡x∗(modlcm(m1,m2))
因此,处理 exCRT 的过程就是不断从方程组内取出两个方程,尝试进行合并然后再压入方程组内,如果无解退出,否则最后方程组内剩下的唯一一个方程就是解系。
线性筛和积性函数
暂待加工。