擴展歐幾裏得筆記
阿新 • • 發佈:2018-04-28
include name string 一個數 col 擴展歐幾裏得 一個 tdi 二元一次方程
擴歐求逆元~~
若有$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); 27printf("%lld",getinv(a,mod)); 28 return 0; 29 }
擴展歐幾裏得筆記