乘法逆元
如果线性同余方程 ,则 称为 的逆元,记作 。
参考资料
费马小定理
快速幂:Pow(i,mod-2)
。
扩展欧几里得
如果 ,说明 满足 。
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 inv[N];
void init()
{
inv[1]=1;
for(int i=2;i<N;i++)
{
inv[i]=(mod-mod/i)*inv[mod%i]%mod;
}
}
例题
洛谷 P3811 【模板】模意义下的乘法逆元
给定两个整数 ,求 中所有整数在模 意义下的乘法逆元。()
保证 是质数。
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
const int N=3000005;
int mod;
ll inv[N];
void init()
{
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(nullptr);
int n;
cin>>n>>mod;
init();
for(int i=1;i<=n;i++)
{
cout<<inv[i]<<'\n';
}
return 0;
}
洛谷 P1082 [NOIP2012 提高组] 同余方程
求同余方程 的最小正整数解。()
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
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;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
ll a,b,x,y;
cin>>a>>b;
exgcd(a,b,x,y);
cout<<(x%b+b)%b<<'\n';
return 0;
}