1.何为逆元?
即为在mod 意义下, 互为逆元;
逆元有什么用?
在做编程题的时候,我们无法让计算机直接除以一个数得出精确值,尤其这个数要代入下面的运算中去比如 (尤其在求组合数的时候) , 这时候我们就可以用逆元来解决,把他转化为;
2.如何求逆元?
1.使用拓展欧几里得算法求逆元;
;
通过上面的转化转化成了拓展性欧几里得问题:
拓展性欧几里得代码如下:
int exgcd(int a,int b,int& x,int &y)
{
if(!b)
{
x=1,y=0;
return a;
}
int d=exgcd(b,a%b,y,x);
y-=(a/b)*x;
return d;
}
这样子我们就求出了b的值!
注意!:存在逆元的条件为a,p是互为素数(gcd(a,p)=1),所以我们还需要返回d(d=gcd(a,p))来检验是否存在逆元!
LL exgcd(LL a,LL b,LL &x,LL &y) { if(b==0) { x=1,y=0; return a; } LL ret=exgcd(b,a%b,y,x); y-=a/b*x; return d; } LL getInv(int a,int mod)//判断是否存在逆元,不存在返回-1; { LL x,y; LL d=exgcd(a,mod,x,y); return d==1?(x%mod+mod)%mod:-1; }
2.使用快速幂+费马小定理求逆元
1.使用条件
mod 的 p 为素数才可以用,不然只可以用上面的方法
2.求a的逆元
1.费马小定理:,(p为素数)
所以就是a的逆元(在mod p意义下);
那怎么求呢,用快速幂
LL qmi(int a,int b,int p)
{
LL res=1%p;
while(b)
{
if(b&1)res=res*a%p;
a=a*(LL)a%p;
b>>=1;
}
return res;
}
结束语:
欢迎大佬提建议!(初学!)