思路:
这里定义
i
−
1
i^{-1}
i−1为当前的逆元
设
k
k
k为p除i的商,r为余数,
r
−
1
为之前求过的逆元
r^{-1}为之前求过的逆元
r−1为之前求过的逆元
则有
k
∗
i
+
r
≡
0
(
m
o
d
p
)
k*i+r≡0(mod~p)
k∗i+r≡0(mod p)
然后两边同乘
r
−
1
i
−
1
r^{-1}i^{-1}
r−1i−1,移项,得
i
−
1
≡
−
r
−
1
∗
k
(
m
o
d
p
)
i^{-1}≡-r^{-1}*k(mod~p)
i−1≡−r−1∗k(mod p)
然后就得出
i
−
1
i^{-1}
i−1
c o d e code code
#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;
ll n, p;
ll inv[3010000];
int main()
{
scanf("%lld%lld", &n, &p);
inv[0]=0, inv[1]=1;
for(int i=2; i<=n; i++)
inv[i]=(p-p/i*inv[p%i]%p+p)%p;
for(int i=1; i<=n; i++)
printf("%lld\n", inv[i]);
return 0;
}