题意
给出n,pn,pn,p,求1∼n1\sim n1∼n中模ppp意义下的乘法逆元。
思路
假设已经求出[1,a−1][1,a-1][1,a−1]的逆元,现在求aaa的逆元。
设k=⌊pa⌋k=\left \lfloor \frac{p}{a} \right \rfloork=⌊ap⌋,r=pmod  ar=p\mod ar=pmoda,那么有
ka+r=pka+r=pka+r=p
所以
ka+r≡0ka+r\equiv 0ka+r≡0
(ka+r)a−1r−1≡0(ka+r)a^{-1}r^{-1}\equiv 0(ka+r)a−1r−1≡0
kr−1+a−1≡0kr^{-1}+a^{-1}\equiv 0kr−1+a−1≡0
a−1≡−kr−1a^{-1}\equiv -kr^{-1}a−1≡−kr−1
因为−kr−1-kr^{-1}−kr−1是负数,所以我们让等式两边加上ppp,
a−1+p≡−kr−1+pa^{-1}+p\equiv -kr^{-1}+pa−1+p≡−kr−1+p
a−1≡p−⌊pa⌋r−1a^{-1}\equiv p-\left \lfloor \frac{p}{a} \right \rfloor r^{-1}a−1≡p−⌊ap⌋r−1
由于已经得出r−1r^{-1}r−1,所以可以直接推出a−1a^{-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]);
}
}