【總結】四種逆元的求法


前言

逆元是一直以來想補的坑了

求逆元 即求 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\n");
    else printf("%d\n",(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\n",inv[i]);
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM