费马小定理求逆元
费马小定理定义及证明

- 为什么每一个\(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);
}