費馬小定理求逆元
費馬小定理定義及證明

- 為什么每一個\(A_i \times a (mod p)\) 是獨一無二的?
對於任意兩個\(A_i \times a\)而言, 二者的差值為a的整數倍,而\((a,p)=1\),因此\((A_i,a) \% p\) 一定不會得到相同的余數(同余的兩個數的差值一定是mod的整數倍)。
- \(\forall A_i \times a \% p (i=1,2,...,p-1)\) 所構成的序列是\((1,2,...,p-1)\)的一種排列
因為 \(x \% p \in [0,p-1]\),而已知\(A_i \times a (mod p)\) 是獨一無二的,因此\(\forall A_i \times a \% p (i=1,2,...,p-1)\) 所構成的序列是\((1,2,...,p-1)\)的一種排列。
- 故得證 $\prod_{i=1}^{n} A_i = \prod_{i=1}^n (A_i \times a)(mod \ \ p) $
因此\((a,p) = 1\)則\(a^{p-1} = 1 (mod \ \ p)\) \(p為素數,gcd(a,p) = 1\)
費馬小定理求逆元
\(a \times b = 1 (mod \ \ p)\)則 \(a,b\)互為 \(mod \ \ p\)逆元
由費馬小定理\(a^{p-1} = 1 (mod \ \ p)\),因此\(a \times a^{p-2} = 1 (mod p)\),因此a的逆元為\(a^{p-2} (mod \ \ p)\)
typedef long long ll;
ll mod = 1e9 + 7;
inline ll quick_pow(ll base,ll idx){
ll ans = 1;
while(idx){
if(idx & 1){
ans *= base;
ans %= mod;
}
base *= base;
base %= mod;
idx >>= 1;
}
return ans;
}
inline ll inv(ll a){
return quick_pow(a,mod-2);
}