【总结】四种逆元的求法

前言

逆元是一直以来想补的坑了

求逆元 即求 x 满足 a/b % mod =a*x%mod =1%mod

费马小定理

限制:mod为质数

#include<bits/stdc++.h>
using namespace std;
int b,mod; 
inline int ksm(int a,int b)
{
    int ret=1;
    while(b)
    {
        if(b&1)ret=(ret*a)%mod;
        a=(a*a)%mod;
        b>>=1;
    }
    return ret;
}
int main()
{
    cin>>b>>mod;
    cout<<ksm(b,mod-2);
    return 0;
}

exgcd

限制:b和mod互质

#include<bits/stdc++.h>
using namespace std;
int b,x,y,mod,gcd; 
inline int exgcd(int a,int b,int &x,int &y)
{
    if(b==0)
    {
        x=1,y=0;
        return a;
    }
    int ret=exgcd(b,a%b,x,y);
    int t=x;x=y,y=t-(a/b)*y;
    return ret;
}
int main()
{
    cin>>b>>mod;
    gcd=exgcd(b,mod,x,y);
    if(gcd!=1)printf("not exist
");
    else printf("%d
",(x%mod+mod)%mod);
    return 0;
}

数学变形

限制:b能被a整除

x=(a%(b*mod))/b

公式递推

限制:mod是质数

逆元不存在的时候会输出0

#include<bits/stdc++.h>
using namespace std;
#define N 3000030
#define ll long long
ll b,mod; 
ll inv[N];
int main()
{
    scanf("%lld%lld",&b,&mod);
    inv[1]=1;
    for(ll i=2;i<=b;i++)
        inv[i]=(mod-mod/i)*inv[mod%i]%mod;
    for(ll i=1;i<=b;i++)
        printf("%lld
",inv[i]);
    return 0;
}
原文地址:https://www.cnblogs.com/NSD-email0820/p/9910344.html