loj 110 乘法逆元
线性求逆元
1 问题描述
求1到n的所有关于模p的逆元。
2 解析
我们设:
\[p=k*i+r,r\in[0,i-1]
\]
于是有:
\[p \equiv 0 (mod \space p)
\]
所以:
\[k*i+r \equiv 0(mod \space p)
\]
两边同时乘以\(i^{-1}\times r^{-1}\):
\[k*r^{-1}+i^{-1}\equiv 0(mod \space p)
\]
所以:
\[i^{-1}\equiv -k*r^{-1}(mod \space p)
\]
所以:
\[i^{-1}=-\left \lfloor \frac{p}{i} \right \rfloor * (p \space mod\space i)^{-1}(mod \space p)
\]
3 代码
#include<bits/stdc++.h>
using namespace std;
int mod,n;
long long inv[3000001];
int main()
{
scanf("%d%d",&n,&mod);
inv[1]=1;
for(int i=2;i<=n;i++)
{
inv[i]=-(p/i)*inv[p%i]%mod;
inv[i]=(inv[i]+mod)%mod;
}
for(int i=1;i<=n;i++)
printf("%d\n",inv[i]);
return 0;
}