1、计算a*x+b*y=gcd(a,b)的通解
返回值是gcd(a,b)
函数运行后得到的x,y即是方程一组特解,记为x0、y0
x = x0 +(b/gcd)*t
y = y0 – (a/gcd)*t
int e_gcd(int a,int b,int &x,int &y)
{
if(b==0)
{
x=1;y=0;
return a;
}
int ans=e_gcd(b,a%b,x,y);
int tp=x;
x=y;
y=tp-a/b*y;
return ans;
}
2、计算a关于p的乘法逆元:a*x=1(mod p)(注:这个式子也称为同余,即a*x%p=1%p)
可写为:a*x+p*y=1,a要与p互质
int e_gcd(int a,int b,int &x,int &y)
{
if(b==0)
{
x=1;y=0;
return a;
}
int ans=e_gcd(b,a%b,x,y);
int tp=x;
x=y;
y=tp-a/b*y;
return ans;
}
int f(int a,int p)
{
int x,y;
e_gcd(a,p,x,y);
p=abs(p);
int ans=x%p;
return ans>0?ans:p+ans;
}
3、分数取模
(a/b)mod p=(a*x) mod p(x是b关于p的乘法逆元)
b关于p的乘法逆元与b%p关于p的乘法逆元相同
如果分子a或分母b特别大,可以先对a、b取模后再计算