码迷,mamicode.com
首页 > 其他好文 > 详细

【总结】四种逆元的求法

时间:2018-11-05 19:20:57      阅读:786      评论:0      收藏:0      [点我收藏+]

标签:efi   gcd   lse   bsp   i++   lin   its   span   return   

前言

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

求逆元 即求 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;
}

 

【总结】四种逆元的求法

标签:efi   gcd   lse   bsp   i++   lin   its   span   return   

原文地址:https://www.cnblogs.com/NSD-email0820/p/9910344.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!