若a*b≡1(mod p)
即a,b互为mod p意义下的逆元
即(x/a)%p应为x*b%p
一、扩展欧几里得求逆元
根据a*b+p*k=1
板子O(logN):
1 #include
2 typedef long longll;3 ll exgcd(ll a,ll b,ll &x,ll &y) {4 if(!b) {5 x=1,y=0;6 returna;7 }8 ll res=exgcd(b,a%b,y,x);9 y-=a/b*x; ///x=x1,y=x1-a/b*y1 x1,y1代表下一状态
10 returnres;11 }12 intmain()13 {14 ll a,p,x,y; ///扩展欧几里得计算a的逆元(mod p)
15 scanf("%lld%lld",&a,&p);16 ll d=exgcd(a,p,x,y);17 printf(d==1?"%lld":"-1",(x+p)%p);///最大公约数不为1,逆元不存在,输出-1
18 return