题意
给出 n , p n,p n,p,求 1 ∼ n 1\sim n 1∼n中模 p p p意义下的乘法逆元。
思路
假设已经求出 [ 1 , a − 1 ] [1,a-1] [1,a−1]的逆元,现在求 a a a的逆元。
设
k
=
⌊
p
a
⌋
k=\left \lfloor \frac{p}{a} \right \rfloor
k=⌊ap⌋,
r
=
p
m
o
d
  
a
r=p\mod a
r=pmoda,那么有
k
a
+
r
=
p
ka+r=p
ka+r=p
所以
k
a
+
r
≡
0
ka+r\equiv 0
ka+r≡0
(
k
a
+
r
)
a
−
1
r
−
1
≡
0
(ka+r)a^{-1}r^{-1}\equiv 0
(ka+r)a−1r−1≡0
k
r
−
1
+
a
−
1
≡
0
kr^{-1}+a^{-1}\equiv 0
kr−1+a−1≡0
a
−
1
≡
−
k
r
−
1
a^{-1}\equiv -kr^{-1}
a−1≡−kr−1
因为
−
k
r
−
1
-kr^{-1}
−kr−1是负数,所以我们让等式两边加上
p
p
p,
a
−
1
+
p
≡
−
k
r
−
1
+
p
a^{-1}+p\equiv -kr^{-1}+p
a−1+p≡−kr−1+p
a
−
1
≡
p
−
⌊
p
a
⌋
r
−
1
a^{-1}\equiv p-\left \lfloor \frac{p}{a} \right \rfloor r^{-1}
a−1≡p−⌊ap⌋r−1
由于已经得出
r
−
1
r^{-1}
r−1,所以可以直接推出
a
−
1
a^{-1}
a−1
代码
#include<cstdio>
int n, p;
int inv[3000001];
int main() {
scanf("%d %d", &n, &p);
inv[1] = 1;
printf("%d\n", inv[1]);
for (int i = 2; i <= n; i++) {
inv[i] = p - (long long)(p / i) * inv[p % i] % p;
printf("%d\n", inv[i]);
}
}