扩展欧几里得笔记

扩欧求逆元~~

若有$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 }

 

posted @ 2018-04-28 11:44  DCDCBigBig  阅读(182)  评论(0编辑  收藏  举报