一:扩展欧拉定理的一种更简便的写法
void exgcd(int a,int b,int &d,int &x,int &y){ if(b) exgcd(b, a % b, d, y, x), y -= x * (a / b); else x = 1, y = 0, d = a; }
二:线性求逆元,若$a*i+b=p,a=\lfloor \frac{p}{i} \rfloor,b=p%i$则$\frac{1}{i}=-\frac{a}{b}$
inv[1] = 1; for(int i=2; i<=n; i++) inv[i] = p - (p / i) * inv[p % i] % p;
三:大步小步算法,求$a^x=b(mod p)$,令$k=\sqrt{p},0<c<=k,0<=d<k$,原式可转化为$a^{ck-d}=b$,即$a^{ck}=b*a^d$,用hash表保存每一个$b*a^d$,最后依次检验即可
时间复杂度$O(\sqrt{n})$
来源:https://www.cnblogs.com/PHDHD/p/12596445.html