分析
O ( n ) O(n) O(n)筛 1 1 1到 n n n所有数模 p p p的逆元:
- 初值
Inv[1]=1
; - 设 p = k i + r p=ki+r p=ki+r,则 k i + r ≡ 0 m o d    p ki+r\equiv 0\mod p ki+r≡0modp;
- 两边同乘 i − 1 r − 1 i^{-1}r^{-1} i−1r−1得 k r − 1 + i − 1 ≡ 0 m o d    p kr^{-1}+i^{-1}\equiv 0\mod p kr−1+i−1≡0modp;
- 移项: i − 1 ≡ − k r − 1 i^{-1}\equiv -kr^{-1} i−1≡−kr−1;
- k = ⌊ p i ⌋ k=\lfloor\dfrac{p}{i}\rfloor k=⌊ip⌋,所以 − k ≡ p − ⌊ p i ⌋ m o d    p -k\equiv p-\lfloor\dfrac{p}{i}\rfloor\mod p −k≡p−⌊ip⌋modp;
- 所以
Inv[i]=(p-p/i)*Inv[p%i]%p
。
代码
#define MOD 998244353
#define MAXC 10000000
int Inv[MAXC+5];
void GetInv(int n){
Inv[1]=1;
for(int i=2;i<=n;i++)
Inv[i]=(LL)Inv[MOD%i]*(MOD-MOD/i)%MOD;
}