逆元
定義
一個數a a a 的倒數a − 1 a^{-1} a − 1 滿足a × a − 1 = 1 a \times a^{-1} = 1 a × a − 1 = 1 。取a a a 的逆元( a m o d   b ) − 1 (a \mod b)^{-1} ( a m o d b ) − 1 滿足( a m o d   b ) × ( a m o d   b ) − 1 m o d   b = 1 (a \mod b) \times (a \mod b)^{-1} \mod b = 1 ( a m o d b ) × ( a m o d b ) − 1 m o d b = 1 。其中b b b 爲質數,a a a 的逆元( a m o d   b ) − 1 = a b − 2 m o d   b (a \mod b)^{-1} = a^{b-2} \mod b ( a m o d b ) − 1 = a b − 2 m o d b 。
證明
由費馬小定理得a b − 1 m o d   b = 1 a^{b-1} \mod b = 1 a b − 1 m o d b = 1 ,即( a b − 2 m o d   b ) × ( a m o d   b ) m o d   b = 1 (a^{b-2} \mod b) \times (a \mod b) \mod b = 1 ( a b − 2 m o d b ) × ( a m o d b ) m o d b = 1 ,故( a m o d   b ) − 1 = a b − 2 m o d   b (a \mod b)^{-1} = a^{b-2} \mod b ( a m o d b ) − 1 = a b − 2 m o d b 。
費馬小定理簡單證明如下:取A = { 1 , 2 , … , b − 1 } A = \{1,2, \dots ,b-1\} A = { 1 , 2 , … , b − 1 } ,則A m o d   b = { 1 , 2 , … , b − 1 } A \mod b = \{1,2, \dots ,b-1\} A m o d b = { 1 , 2 , … , b − 1 } ;取a × A = { a , 2 a , … , ( b − 1 ) a } a \times A = \{a,2a, \dots, (b-1)a\} a × A = { a , 2 a , … , ( b − 1 ) a } ,則a × A m o d   b = { 1 , 2 , … , b − 1 } a \times A \mod b = \{1,2, \dots ,b-1\} a × A m o d b = { 1 , 2 , … , b − 1 } 仍然成立(此處可見下面證明)。取A A A 中所有元素相乘得S S S ,取a × A a \times A a × A 中所有元素相乘得a b − 1 × S a^{b-1} \times S a b − 1 × S ,由{ S m o d   b = ( b − 1 ) ! m o d   b a b − 1 × S m o d   b = ( b − 1 ) ! m o d   b \left\{\begin{array}{cc} S \mod b = (b-1)! \mod b\\ a^{b-1} \times S \mod b = (b-1)! \mod b \end{array}\right. { S m o d b = ( b − 1 ) ! m o d b a b − 1 × S m o d b = ( b − 1 ) ! m o d b 得a b − 1 m o d   b = 1 a^{b-1} \mod b = 1 a b − 1 m o d b = 1 。
下面用反證法證明a × A m o d   b = { 1 , 2 , … , b − 1 } a \times A \mod b = \{1,2, \dots ,b-1\} a × A m o d b = { 1 , 2 , … , b − 1 } 。對於任意x , y ∈ a × A , x < y x,y \in a \times A, x \lt y x , y ∈ a × A , x < y ,假設x m o d   b = y m o d   b x \mod b = y \mod b x m o d b = y m o d b ,那麼( y − x ) m o d   b = 0 (y-x) \mod b = 0 ( y − x ) m o d b = 0 ,由{ y m o d   a = 0 x m o d   a = 0 \left\{\begin{array}{cc} y \mod a = 0\\ x \mod a = 0 \end{array}\right. { y m o d a = 0 x m o d a = 0 得( y − x ) m o d   a = 0 (y-x) \mod a = 0 ( y − x ) m o d a = 0 ,由b b b 爲質數得l c m ( a , b ) = a × b lcm(a, b) = a \times b l c m ( a , b ) = a × b ,故( y − x ) m o d   ( a × b ) = 0 (y-x) \mod (a \times b) = 0 ( y − x ) m o d ( a × b ) = 0 ,因此y − x ≥ a × b y-x \ge a \times b y − x ≥ a × b ,與x , y ∈ a × A x,y \in a \times A x , y ∈ a × A 矛盾,由此可得x m o d   b ≠ y m o d   b x \mod b \ne y \mod b x m o d b ̸ = y m o d b 。因此a × A m o d   b a \times A \mod b a × A m o d b 有( b − 1 ) (b-1) ( b − 1 ) 個互不相同的元素,即a × A m o d   b = { 1 , 2 , … , b − 1 } a \times A \mod b = \{1,2, \dots ,b-1\} a × A m o d b = { 1 , 2 , … , b − 1 } 。
思路
利用快速冪 求a a a 的逆元a b − 2 m o d   b a^{b-2} \mod b a b − 2 m o d b 。
時間複雜度
O ( log n ) O(\log n) O ( log n )
模板
#include "FP.h"
typedef long long LL;
const LL MOD = 1e9+7; // the divisor of answer
/**
* @param a: the number a
* @return: the inverse of a
* @other: FP is Fast Power
*/
LL INV(LL a) {
return FP(a, MOD-2);
}
應用1
求組合數C n m m o d   b C_n^m \mod b C n m m o d b 。由C n m = n ! m ! ( n − m ) ! C_n^m = \frac {n!}{m!(n-m)!} C n m = m ! ( n − m ) ! n ! 得C n m m o d   b = n ! m ! ( n − m ) ! m o d   b = ( n ! m o d   b ) × ( m ! m o d   b ) − 1 × ( ( n − m ) ! m o d   b ) − 1 m o d   b C_n^{m} \mod b = \frac {n!}{m!(n-m)!} \mod b = (n! \mod b) \times (m! \mod b)^{-1}\times((n-m)! \mod b)^{-1}\mod b C n m m o d b = m ! ( n − m ) ! n ! m o d b = ( n ! m o d b ) × ( m ! m o d b ) − 1 × ( ( n − m ) ! m o d b ) − 1 m o d b 。先預處理1 ! , 2 ! , … , n ! 1!,2!,\dots,n! 1 ! , 2 ! , … , n ! ,時間複雜度爲O ( n ) O(n) O ( n ) ,再直接求C n m m o d   b C_n^m \mod b C n m m o d b ,時間複雜度爲O ( 1 ) O(1) O ( 1 ) 。
模板1
#include "INV.h"
const LL N = 1e6+10; // the maximum number
LL fac[N]; // the factorial of numbers
LL inv[N]; // the inverse of factorial
/**
* @other: initialize fac and inv
*/
void init() {
inv[0] = fac[0] = 1; // 0! = 1, INV(1) = 1
for (int i = 1; i < N; ++i) {
fac[i] = fac[i-1] * i % MOD; // i! = (i-1)! * i
inv[i] = INV(fac[i]);
}
}
/**
* @param n: the number n
* @param m: the number m
* @return: C(n, m)
*/
LL C(LL n, LL m) {
return fac[n] * inv[m] % MOD * inv[n-m] % MOD;
}
應用2
已知p , q , b p,q,b p , q , b ,求a a a 滿足a × p m o d   b = q m o d   b a \times p \mod b = q \mod b a × p m o d b = q m o d b 。由( a × p m o d   b ) × ( p m o d   b ) − 1 = ( q m o d   b ) × ( p m o d   b ) − 1 (a \times p \mod b) \times (p \mod b)^{-1} = (q \mod b) \times (p \mod b)^{-1} ( a × p m o d b ) × ( p m o d b ) − 1 = ( q m o d b ) × ( p m o d b ) − 1 得a = ( q m o d   b ) × ( p m o d   b ) − 1 a = (q \mod b) \times (p \mod b)^{-1} a = ( q m o d b ) × ( p m o d b ) − 1 。
模板2
#include "INV.h"
/**
* @param p: the number p
* @param q: the number q
* @return: the number a
*/
LL cal(LL p, LL q) {
return q * INV(p) % MOD;
}