扩欧法:
ll kgcd(ll a,ll b,ll &x,ll &y)//扩欧
{
if(!b)
{
x=1;y=0;return a;
}
ll t=kgcd(g,a%b,y,x);
y-=a/b*x;
return t;
}
ll niyuan(ll a,ll p)
{
ll x,y;
kgcd(a,p,x,y);
return (x%p+p)%p;//对x取正
}
费马小定理法:
ll mod_pow(ll a, ll b, ll p)
{
ll ans = 1;
a %= p;
while(b)
{
if(b & 1) ans = ans * a % p;
a = a * a % p;
b >>= 1;
}
return ans;
}
ll mod_inv(int a, int p)
{
return mod_pow(a, p-2, p);
}
线性时间求所有逆元:
int inv[maxn];
inv[1] = 1;
for(int i = 2; i < maxn; i++)
inv[i] = (p - p / i) * inv[p % i] % p;
详情见https://blog.csdn.net/discreeter/article/details/78193418