扩展欧几里得笔记
Posted Altria Pendragon
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了扩展欧几里得笔记相关的知识,希望对你有一定的参考价值。
扩欧求逆元~~
若有$a$和$x$满足$ax≡1(mod p)$,则称$a$和$x$是在模$p$意义下的乘法逆元,此时在模$p$意义下乘以$x$相当于除以$x$。
一个数有逆元的充要条件是$gcd(a,p)=1$,此时逆元唯一存在。
给定$p$,要求$a$的逆元,相当于求解同余方程$ax≡1(mod p)$;
容易转化为求解方程$ax-py=1$。
所以就可以用解二元一次方程的解法,解出一组的解$x_{0}$,$y_{0}$,然后检验$gcd(a,p)$是否为1;
注意到当$p$为质数的时候可以省略这一步;
然后调整$x_{0}$到$0...m-1$的范围中就行了。
没了?
时间复杂度$O(nlogn)$
代码:
1 //求mod998244353意义下的逆元 2 #include<iostream> 3 #include<cstring> 4 #include<cstdio> 5 #include<cmath> 6 #define mod 998244353 7 using namespace std; 8 typedef long long ll; 9 ll a; 10 ll exgcd(ll a,ll b,ll &d,ll &x,ll &y){ 11 if(!b){ 12 d=a; 13 x=1; 14 y=0; 15 }else{ 16 exgcd(b,a%b,d,y,x); 17 y-=x*(a/b); 18 } 19 } 20 ll getinv(int a,int p){ 21 ll d,x,y; 22 exgcd(a,p,d,x,y); 23 return (x+p)%p; 24 } 25 int main(){ 26 scanf("%lld",&a); 27 printf("%lld",getinv(a,mod)); 28 return 0; 29 }
以上是关于扩展欧几里得笔记的主要内容,如果未能解决你的问题,请参考以下文章