[模板]乘法逆元
题目大意:求1-n中每个数的逆元
逆元定义:
若\(ax=1(mod~b)\),且\(a,b\)互质,那么把\(x\)称为\(a\)在\(mod~b\)意义下的逆元
做法:
1:做法很多,这里只说明一个最快的线性算法
2:设\(p=k×i+r,(1<r<i<p)\)也就是\(k\)是\(p÷i\)的商,\(r\)是余数 。
3:考虑\(k×i+r=0(mod~p)\)两边同时除以\(i×r\)然后可以得到\(k×r^{-1}+i^{-1}=0(mod~p)\) \(i^{-1}=-k×r^{-1}(mod~p)\) \(i^{-1}=-\lfloor\frac{p}{i}\rfloor×(p~mod~i)^{-1}(mod~p)\)
#include <cstdio>
#include <iostream>
#include <algorithm>
typedef long long LL;
using namespace std;
const int maxn = 3e6+7;
int n,p;
LL inv[maxn];
int main()
{
inv[1] = 1;
scanf("%d%d",&n,&p);
for(int i=2;i<=n;i++)
inv[i] = (p - p/i) * inv[p%i] % p;
for(int i=1;i<=n;i++)
printf("%lld\n",inv[i]);
return 0;
}