这是一道模板题
给定 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<