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