【总结】四种逆元的求法
前言
逆元是一直以来想补的坑了
求逆元 即求 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; }
“Make my parents proud,and impress the girl I like.”