给定 n,p ,求 1∼n 中所有整数在 modp 意义下的乘法逆元。
首先是乘法逆元的定义:
若 ax≡1modp,则 x 为 amodp 的逆元,记为 a−1
线性求逆元:
在 modp 意义下
pmodaa⌊ap⌋modpa⌊ap⌋modpamodpa−1modpa−1modp=(p−a⌊ap⌋)modp=(p−pmoda)modp=−(pmoda)modp=−(pmoda)⌊ap⌋−1modp=−(pmoda)−1⌊ap⌋modp=(p−⌊ap⌋)(pmoda)−1modp
最后一步是为了防止出现负数,中间的一些步骤基本上是各种交换位置,其中的一些步骤是因为 modp,可以去掉前面的 p。
#include<iostream>
#include<cstdio>
#define MAXN 3000010
using namespace std;
typedef long long ll;
int inv[MAXN],n,p;
int main(){
#ifdef WINE
freopen("data.in","r",stdin);
#endif
scanf("%d%d",&n,&p);
inv[1]=1;
printf("1\n");
for(int i=2;i<=n;i++){
inv[i]=(ll)(p-(p/i))*inv[p%i]%p;
printf("%d\n",inv[i]);
}
return 0;
}