总结四种逆元的求法
Posted nsd-email0820
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了总结四种逆元的求法相关的知识,希望对你有一定的参考价值。
前言
逆元是一直以来想补的坑了
求逆元 即求 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; }
以上是关于总结四种逆元的求法的主要内容,如果未能解决你的问题,请参考以下文章