P3811 【模板】乘法逆元

题目背景

这是一道模板题

题目描述

给定 n,p 求 1∼n 中所有整数在模 p 意义下的乘法逆元。

这里 a 模 p 的乘法逆元定义为 ax≡1(modp) 的解。

输入格式

一行两个正整数 n,p。

输出格式

输出 n 行,第 i 行表示 i 在模 p 下的乘法逆元。

输入输出样例

输入 #1复制

10 13

输出 #1复制

1
7
9
10
8
11
2
5
3
4

说明/提示

1≤n≤3×10^6,n

输入保证 p 为质数。

逆元普遍来说有Ⅳ种求法,分别是废马小定理,exgcd,Euler,线性逆元,

在本题中,由于exgcd超时,so用采用时间复杂度O(n)的线性逆元

#include
using namespace std;
//#pragma GCC optimize(2)
#define  endl '\n'
#define lowbit(x) ((x)&-(x))
const int mod=1e9+7;
typedef long long ll;
ll ans=0,n1,m1;
ll t,s1,s2,s3,s4,max1=0,min1=100000000,sum=0,n,m,i,j,k,l,r;
ll u,v,w;
inline int read() {
	bool sym=0;
	int res=0;
	char ch=getchar();
	while(!isdigit(ch))sym |=(ch =='-'),ch=getchar();
	while(isdigit(ch)) res =(res<<3)+(res<<1)+(ch^48),ch=getchar();
	return sym ? -res : res;
}
void print(int x) {
	if(!x)return;
	print(x/10);
	putchar(x%10+'0');
}


ll exgcd(ll a,ll b,ll &x,ll &y)
{
	if(b==0){
		x=1,y=0;
		return a;
	}
	ll d=exgcd(b,a%b,y,x);
	y-=a/b*x;
	return d;
}
ll cc(ll a,ll m){    ///exgcd 法 
	
	ll x,y;
	exgcd(a,m,x,y);
	return (x%m+m)%m;
	
}

ll inv[3000008];   // 逆元表
 
void mod_inverse(ll n, ll mod){// 线性逆元 
    inv[0] = inv[1] = 1;
    for(int i = 2; i <= n; i++)
        inv[i] = (mod - mod / i) * inv[mod % i] % mod;
}

int main() {

	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
cin>>n>>m;
mod_inverse(n,m);
for(i=1;i<=n;i++)
cout<

你可能感兴趣的:(c++,算法,逆元,扩展欧几里得)