1. 程式人生 > >擴展歐幾裏得筆記

擴展歐幾裏得筆記

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); 27
printf("%lld",getinv(a,mod)); 28 return 0; 29 }

擴展歐幾裏得筆記