整除
定義
若 $ a = bk $ , 其中 $ a \in Z, b \in Z, k \in Z $, 則稱 $ b $ 整除 $ a $ , 記做 $ b | a $.
也稱 $ b $ 是 $ a $ 的約數(因數), $ a $ 是 $ b $ 的倍數
性質
\((1)\) $ 1 $ 整除任何數 $ ( 1 | k ) , k \in Z$ , $ 0 $ 被任何數整除 $ ( k | 0), k \in Z $
\((2)\) 若 $ a | b $ 且 $ a | c $, 則 $ a | (b + c), a | (b - c)$
\((3)\) 若 $ a | b $, 則對於任意整數 $ c $ , $ a | bc $
\((4)\) 傳遞性:若 $ a | b $ 且 $ b | c $ , 則 $ a | c $
\((5)\) 有待添加(其實是太多了,不想證)
例題
質數和合數
定義
質數又稱素數(下文中不區分質數和素數)
設 $ p \in Z_+ $
\((1)\) 當且僅當 $ p > 1 $ 且只能被 $ 1 $ 和 $ p $ 整除(即 $ p $ 僅有兩個因子 $ 1 $ 和 $ p $ ), 則稱 $ p $ 是一個質數;
\((2)\) 否則, 若 $ p > 1 $ , 則稱 $ p $ 是一個合數;
\((3)\) 當 $ p = 1 $, $ p $ 既不是質數也不是合數.
性質
\((1)\) 質數有無窮多個.
\((2)\) 若 $ n $ 是一個合數, 則 $ n $ 至少有一個質因子.
\((3)\) 若 $ n $ 是一個合數, 其中最小的質因子一定不大於 $ \sqrt n $
\((4)\) 若 $ n $ 是一個合數, 不大於 $ n $ 的質數約有 $ \dfrac{n}{\ln n} $ 個.
唯一分解定理
把正整數 $ n $ 寫成質數的乘積
$ n = p_1{a_1}p_2{a_2}p_3{a_3}...p_k{a_k} $, 其中 $ p_i $ 為質數, $ a_i $ 為正整數
這樣的表示是唯一的.
試除法
最簡單的判斷一個數\(n\)是否為質數的方法
只需要從 $ 2 $ 除到 $ \sqrt n$ 即可, 如果中間有整數能整除 \(n\) 則 \(n\) 是合數, 反之 $ n $ 是質數
例題
[CF 776B] Sherlock and his girlfriend
同余
定義
對於整數 \(a, b, b > 0\), 則存在唯一的整數 \(q, r\) 滿足 \(a = bq + r\)
其中 $0 \leqslant r < b $。
其中稱 \(q\) 為商, $ r $ 為余數。
余數用 $ a \bmod b $ 表示。
若兩數 \(a, b\) 除以 \(c\) 的余數相等,則稱\(a,b\) 模 $ c $ 同余,記做 \(a \equiv b \pmod{c}\)。
性質
\((1)\) $a \equiv b \pmod{c} \Leftrightarrow c | ( a − b ) $
推論:若 \(a \equiv b \pmod{c}, d|c\), 則 \(a \equiv b \pmod{d}\)
\((2)\) 有待添加(其實是太多了,不想證)
最大公約數
定義
設 \(a, b\) 是不都為 \(0\) 的整數, \(c\) 為滿足 \(c | a\) 且 \(c | b\) 的最大整數.
則稱 \(c\) 是 \(a, b\)的最大公約數
記為 \(\gcd(m, n)\) 或 \((a, b)\)
若\((a, b) = 1\), 則稱 \(a, b\) 互質(互素)
性質
\((1)\) \((a, a) = (0, a) = a\)
\((2)\) 若 \(a|b\) , 則\((a, b) = a\)
\((3)\) \((a, b) = (a, a + b) = (a, ka + b)\)
\((4)\) \((ka, kb) = k \times (a, b)\)
\((5)\) \((a, b, c) = ((a , b), c)\)
求gcd
求 \(GCD\) 的一般公式:質因數分解
$ a = p_1{a_1}p_2{a_2}p_3{a_3}...p_k{a_k} $
$ b = p_1{b_1}p_2{b_2}p_3{b_3}...p_k{b_k} $
$ (a, b) = p_1^{\min(a_1, b_1)}p_2^{\min(a_2, b_2)}p_3^{\min(a_3, b_3)}...p_k^{\min(a_k, b_k)} $
例題
[CF 664A] Complicated GCD
[CF 757B] Bash’s Big Day
歐幾里得算法
作用
又稱輾轉相除法, 迭代求兩數 \(gcd\) 的做法
公式
\(gcd(a, b) = gcd(b, a \% b)\)
code
遞歸寫法
int gcd(int a, int b) { return !b ? a : gcd(b, a % b);}
二進制優化
inline int gcd(int x, int y) {
int i, j;
if (x == 0) return y;
if (y == 0) return x;
for (i = 0;0 == (x&1); ++i) x >>= 1;
for (j = 0;0 == (y&1); ++j) y >>= 1;
if(j<i) i = j;
while (1) {
if (x < y) x ^= y , y ^= x , x ^= y;
if (0 == (x -= y)) return y << i;
while (0 == (x & 1)) x >>= 1;
}
}
裴蜀定理
定義
設 \((a, b) = d\), 則對於任意整數 \(x, y\), 有 \(d | (ax + by)\) 成立;
特別地, 一定存在 \(x, y\) 滿足 \(ax + by = d\).
等價的表述:不定方程 \(ax + by = c (a, b, c\) 為整數 \()\) 有解的充要條件為 \((a, b) | c\)
推論
\(a,b\) 互質等價於 \(ax + by = 1\) 有解
擴展歐幾里得
定義
就是如何求得 \(ax + by = d\) 的一個解, \(d = (a, b)\)
做法
考慮使用歐幾里得算法的思想, 令 \(a = bq + r\), 其中 \(r = a \bmod b\)
遞歸求出 \(bx + ry = d\) 的一個解
設求出 \(bx + ry = d\) 的一個解為 \(x = x_0, y = y_0\)
將 \(a = bq + r\) 帶入 \(ax + by = d\) 得
\(b(qx + y) + rx = d\)
令 \(qx+y = x_0, x = y_0\), 則上式成立
故 \(x = y_0, y = x_0 - qy_0\) 為 \(ax + by = d\) 的解
遞歸的邊界: \(b = 0\) 時, 令 \(x = 1, y = 0\).
code
void exgcd(int a, int b, int &x, int &y) {
if (b == 0) {
x = 1;
y = 0;
return ;
}
int q = a / b, r = a % b;
exgcd(b, r, y, x);
y -= q * x;
}
求得所有解
先用 \(exgcd\) 求出任意一個解 \(x = x_0, y = y_0\)
再求出 \(ax + by = 0\) 的最小的解
\(x = d_x = \dfrac{b}{(a, b)}, y = d_y = -\dfrac{a}{(a, b)}\)
所有解就是 \(x = x_0 + kd_x, y = y_0 + kd_y, k \in Z\)
逆元
定義
若 \(ax \equiv 1 \pmod b\) , 則稱 \(x\) 是 \(a\) 關於模 \(b\) 的逆元.
常記做 \(a^{-1}\)
同時, 上式等價於 \(ax + by = 1\) (同余的性質)
條件
逆元不一定存在, 存在的充要條件是 \((a, b) = 1\)
推論
\(p\) 是質數, \(p\) 不整除 \(a\), 則 \(a\) 模 \(p\) 的逆元存在
結論
在 \([0, b)\) 的范圍內, \(a\) 關於模 \(b\) 的逆元(若存在), 是唯一的.
方法
可以用 \(exgcd\) 求逆元
code
int inv(int a, int b) {
int x, y;
exgcd(a, b, x, y);
return x;
}
線性求逆元
方法一
遞推
假設現在要求 \(i\) 的逆元
考慮帶余除法, 設 \(p = iq + r\), 則有 \(iq + r \equiv 0 \pmod p\)
考慮到 \(p\) 是質數, 因此 \(r\) 不為 \(0\), \(r\) 的逆元存在
等式兩邊乘 \(i^{-1} + r^{-1} \equiv 0 \pmod p\)
因此 \(i^{-1} \equiv -qr^{-1} \equiv -\lfloor\dfrac{p}{i}\rfloor(p \bmod i)^{-1} \pmod p\)
code
inline int inv(int n) {
inv[1] = 1;
for (int i = 2; i <= n; i++ ){
inv[i] = (p - p / i)*inv[p % i] % p;
}
}
方法二
倒推
先求 \(n!\) 的逆元(\(exgcd\) 或者之后會提到的快速冪)
然后利用 \(((k - 1)!)^{-1} \equiv k \times (k!) ^{-1} \pmod p\)
倒推求出 \(1!...n!\) 的逆元
再利用 \(k^{-1} \equiv (k - 1)! \times (k!)^{-1} \pmod p\)
就可以求出 \(1...n\) 的逆元了
code
不想寫其實是我沒用過,一直用的遞推
費馬小定理
定義
\(a^{p - 1} \equiv 1 \pmod p\)
變式: $a^{p - 2} \equiv \dfrac{1}{a} \pmod p \Leftrightarrow a \times a^{p - 2} \equiv 1 \pmod p $
前提
\(p\) 是質數, 且 \(a\) 不是 \(p\)的質數
方法
直接快速冪取模就行
code
inline ll f_pow(ll x, ll y, int mod) {
ll ans = 1;
while (y) {
if (y & 1) ans = (ans * x) % mod;
x = (x * x) % mod;
y >>= 1;
}
return ans;
}
inline int fermat(int a, int mod) {
return f_pow(a, mod - 2);
}
線性同余方程
定義
形如 \(ax \equiv c \pmod b\) 的方程稱為線性同余方程
等價於 \(ax + by = c\) 因此有解條件為 \((a, b) \mid c\)
求解
任意的線性同余方程總可以判定為無解,或化為 \(x \equiv a \pmod m\) 的形式
線性同余方程組 && 中國剩余定理 && 歐拉定理
不想寫了,之后再寫,先掛一個大佬的鏈接吧
大佬