线性推逆元。
p
是质数。首先显然有
然后强行
p=ki+r
,其中
i
是我们想求的逆元。
有
kr−1+i−1≡0(mod p)
即
i−1≡−kr−1(mod p)
根据带余除法有
i−1≡−⌊pi⌋×(p mod i)−1
实际操作中为了防止负数出现还要稍微处理处理
#include <iostream>
#include <cstdio>
using namespace std;
int inv[3000006], n, p;
int main(){
cin>>n>>p;
inv[1] = 1;
cout<<"1\n";
for(int i=2; i<=n; i++){
inv[i] = (long long)(p-p/i)*inv[p%i]%p;
printf("%d\n", inv[i]);
}
return 0;
}