结论:
假设取模MM
初始化设
则
inv[i]=(M−Mi)×inv[M % i] % Minv[i]=(M−Mi)×inv[M % i] % M
推导如下:
设
t=Mi , k=M % it=Mi , k=M % i
根据同余定义我们可以得到
t×i+k≡0 (mod M)t×i+k≡0 (mod M)
即:
−t×i≡k (mod M)−t×i≡k (mod M)
两边同时乘上i×k的逆元i×k的逆元
即
−t×i×i−1×k−1≡k×k−1×i−1 (mod M)−t×i×i−1×k−1≡k×k−1×i−1 (mod M)
即
−t×k−1≡i−1 (mod M)−t×k−1≡i−1 (mod M)
即
−t×inv[k]≡inv[i] (mod M)−t×inv[k]≡inv[i] (mod M)
这时我们得到了递推式,要求inv[i]inv[i]
其实答案就是
−t×inv[k] % M−t×inv[k] % M
我们将一开始的设的t,k带入得到t,k带入得到
(−Mi)×inv[M % i] % M(−Mi)×inv[M % i] % M
即:
(−Mi) % M×inv[M % i] % M(−Mi) % M×inv[M % i] % M
为了防止出现负数(−Mi) % M(−Mi) % M完全可以加上一个MM即
原式化简为了
inv[i] % M=(M−Mi)×inv[M % i] % Minv[i] % M=(M−Mi)×inv[M % i] % M
推导完毕。
复杂度O(n)O(n)
code:
void init(){
inv[1] = 1;
for(int i = 2; i <= n; i++)
inv[i] = inv[M % i] * (M - M / i) % M;
}