tags |
---|
成大高階競技程式設計 2020, ys |
在演算法競賽中,通常涉及的數論大部份是整數的代數性質
中譯 最大公因數,以下簡稱 GCD
給定整數
#include<algorithm>
有內建的 __gcd
函數
CODEFORCES 1155C Alarm Clocks Everywhere CODEFORCES 1133D Zero Quantity Maximization CODECHEF SnackDown 2019 Round 1A Chef and Periodic Sequence CODEFORCES 1107D Compression
$\gcd(a, b) = \gcd(b, a)$ $\gcd(a, 0) = |a|$ $\gcd(a, b) = \gcd(a, b % a)$
$%$ 是 C++ 中的取餘數運算,表示存在$k$ 滿足$0 \leq b% a = b - k\cdot a < a$
輾轉相除法
:::info
給定整數
令
:::warning
證明上述過程
綜合上面過程,實作程式碼:
int gcd(int a, int b)
{ return a? gcd(b%a, a) : b; }
對於所有整數
:::info
給定整數
令
即
$x_n$ 為任意整數
而根據 GCD 性質
也就是說 $$ g = a_i \cdot x_{j-1} + b_i \cdot y_{j-1} \text{ for }\begin{cases} x_{j-1} = y_j - \lfloor{b_i\over a_i}\rfloor \cdot x_j \ y_{j-1} = x_j \end{cases} $$
綜合上述過程:
int gcd(int a, int b, int &x, int &y) {
if(!a) {
x = 0, y = 1; // x 為任意整數
return b;
}
int g = gcd(b%a, a, x, y);
int xp = y - b/a * x, yp = x; // p := previous
x = xp, y = yp;
return g;
}
UVa OJ 10104 Euclid Problem UVa OJ 10090 Marbles UVa OJ 10413 Crazy Savages
在競賽中若計算結果超出了數值範圍外,則通常會要求結果對某個數字取餘數 所以得熟悉取完餘數後的數字們之間的關係及運算。
若數字們都對
記得檢查若 a 為負數的情況
若
可將括號內看作數字們處於一個特定狀態下,而模
$n$ 通常會省略括號
並且若
CODEFORCES 1178C Tiles CODEFORCES 1151C Problem for Nazar CODEFORCES 1165E Two Arrays and Sum of Functions3
如果
例如
$1, 5$ 和$6$ 互質,$\phi(6) = 2$
如果
是歐拉定理的特例
數字們模
注意,在同餘運算中只會有整數,有理數無理數等其他數不會出現
反元素指的是元素與其運算後為單位元素的元素 例如:
- 整數
$a$ 的加法反元素為$-a$ - 整數
$a$ 的乘法反元素為$1\over a$
而元素
根據 Bezout's Thm
-
$ax + ny = \gcd(a, n) = 1$ 在模$n$ 有$ax \equiv 1 \mod n$ -
$ax + ny = \gcd(a, n) \not= 1$ 在模$n$ 有$ax \not\equiv 1 \mod n$
也就是說
- 當
$n$ 為質數時:
根據費馬小定理有
下週教的快速求冪演算法能在
$O(\log_2 n)$ 得到$a^{n-2}$
- 當
$n$ 非質數時:
根據 Bezout's Thm 有
$$
\begin{split}
&a\cdot x + n\cdot y \space &= 1 \
\Rightarrow \space &a \cdot x &\equiv 1 \mod n
\end{split}
$$
可用擴展歐幾里得演算法找到
ZERO JUDGE a289 Modular Multiplicative Inverse CODEFORCES 300C Beautiful Numbers NCKU OJ 22 爬樓梯 k CODEFORCES 935D Fafa and Ancient Alphabet
:::info
給定
求滿足下式的
設
要仔細思考,怎樣的
$y_i$ 才會符合問題中的方程式定義?
從小規模觀察,假設
- 模
$m_1$ 的時候$(y_1, y_2) \equiv (1, 0)$ - 模
$m_2$ 的時候$(y_1, y_2) \equiv (0, 1)$
所以模數應當是對應的
- 模
$m_2$ 的時候$y_1 \equiv 0$ - 模
$m_1$ 的時候$y_2 \equiv 0$
接著思考
-
$y_1 = m_2\cdot t_1 \equiv 1 \mod m_1$ ,可推出$t_1$ 是$m_2$ 的模$m_1$ 反元素 -
$y_2 = m_1\cdot t_2 \equiv 1 \mod m_2$ ,可推出$t_2$ 是$m_1$ 的模$m_2$ 反元素
最後整理上述有
$$
x = (m_2\cdot t_1) a_1 + (m_1\cdot t_2) a_2 + k\cdot m_1 \cdot m_2
$$
其中
加法最後項
$k\cdot m_1 \cdot m_2$ 表示$x$ 有多種解,是根據同餘關係有$a \equiv a + k\cdot m \mod m$
根據上述的提示,可以嘗試推廣當
於是推出原問題方程組的解為
$$
\begin{split}
x &= (M_1\cdot t_1) a_1 + (M_2\cdot t_2) a_2 + \cdots + (M_n\cdot t_n) a_n + k\cdot M \
&= \sum\limits_{k=1}^n (M_i\cdot t_i) a_i + k\cdot M
\end{split}
$$
其中
ZERO JUDGE d791 00756 - Biorhythms CODEFORCES 687B Remainders Game Kattis generalchineseremainder Chinese Remainder Theorem (non-relatively prime moduli) TIOJ 1459 B.完全子圖