求阶乘的逆元,需要求每个阶乘的逆元,一般求最大的逆元,然后倒推剩下的全部。
void init() {
fact[0] = 1;//0的阶乘
for (int i = 1; i < maxn; i++) {
fact[i] = fact[i - 1] * i %mod;
}
inv[maxn - 1] = power(fact[maxn - 1], mod - 2);//快速幂
for (int i = maxn - 2; i >= 0; i--) {
inv[i] = inv[i + 1] * (i + 1) %mod;
}
}
洛谷P3811,线性求逆元(一连串数字的逆元)
#include<iostream>
using namespace std;
typedef long long ll;
ll inv[3000005]={0,1};
int main()
{
int n,p;
scanf("%d%d",&n,&p);
printf("1\n");
for(int i=2;i<=n;i++){
inv[i]=(ll)p-(p/i)*inv[p%i]%p,printf("%lld\n",inv[i]);
}
return 0;
}