[乘法逆元]

P3811

[模板]乘法逆元

题目大意:求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;
} 
posted @ 2019-11-14 16:14  风丨铃  阅读(203)  评论(0编辑  收藏  举报