inv(a)*a=1(mod p),这里的inv(a)就是a关于p的逆元,这里a和p一定互质量
利用扩展欧几里德直接求:
ax+by=1
ax%b=1%b
ax=1(mod b)
这样就求出x是a关于b的逆元
void ex_gcd(ll a,ll b,ll &x,ll &y,ll &d)
{
if(!b)
{
d=a;x=1;y=0;
}
else
{
ex_gcd(b,a%b,y,x,d);
y-=x*(a/b);
}
}
ll inv(ll a,ll n)
{
ll x,y,d;
ex_gcd(a,n,x,y,d);
return d==1?(x+n)%n:-1;//检查gcd(a,n)是否为1
}
逆元打表:
直接上公式:inv(a) = (p - p / a) * inv(p % a) % p,打表做法只适用于p为素数的情况,直接求得1-n关于p的逆元
ll inv[N];
void inv_list(ll n,ll p)
{
inv[1]=1;
for(int i=2;i<=n;i++)
{
inv[i]=(p-p/i)*inv[p%i]%p;
}
}