在演算法競賽中,通常涉及的數論大部份是整數的代數性質
在競賽中若計算結果超出了數值範圍外,則通常會要求結果對某個數字取餘數
所以得熟悉取完餘數後的數字們之間的關係及運算。
若數字們都對 取餘數後,它們就處於"同餘 "的狀態下了
將 除以 的餘數記做
記得檢查若 a 為負數的情況
若 與 相等,則記
可將括號內看作數字們處於一個特定狀態下,而同餘通常會省略括號
並且若
則
CODEFORCES 1151C Problem for Nazar
CODEFORCES 1165E Two Arrays and Sum of Functions[1]
如果 互質,那麼
這裡 是與 互質且小於 的正整數的個數
例如 和 互質,
如果 互質,且 為質數,那麼
是歐拉定理的特例
中譯 最大公因數,以下簡稱 GCD
給定整數 ,它倆各自有自己的因數[2],取相同的因數中最大的數,即最大公因數
#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
是 C++ 中的取餘數運算,表示存在 滿足
輾轉相除法
給定整數 求出
令 ,根據 GCD 性質:
證明上述過程 中左參數比右參數要先變為
綜合上面過程,實作程式碼:
對於所有整數 ,存在整數 使得
給定整數 求出整數 滿足
令 ,配合 Bezout’s Thm 得到:
明顯的,
即 為任意整數
而根據 GCD 性質
以及
得到
也就是說
綜合上述過程:
UVa OJ 10104 Euclid Problem
UVa OJ 10090 Marbles
UVa OJ 10413 Crazy Savages