方法一:扩展欧几里得算法求逆元
扩展欧几里得算法可以求解ax+by=gcd(a,b)这样一个不定方程的同时求出gcd(a,b)。
当a,b互质时gcd(a,b)=1得ax+by=1,两边同时%b得a*x%b=1即x为a%b的逆元。(即刚刚解出的x)
C语言
long long Extended_Euclid(long long a,long long b,long long *x,long long *y)
{
if(b==0)
{
*x=1;
*y=0;
return a;
}
else
{
long long ans=Extended_Euclid(b,a%b,x,y);
long long temp=*x;
*x=*y;
*y=temp-a/b*(*y) ;
return ans;
}
}
long long Inverse_Element(long long a,long long p)
{
long long x,y;
long long d=Extended_Euclid(a,p,&x,&y);
if(d==1)
return(x%p+p)%p;
else
return -1;
}
C++:
long long Extended_Euclid(long long a,long long b,long long &x,long long &y)
{
if(a==0&&b==0)
return -1;
if(b==0)
{
x=1;
y=0;
return a;
}
long long temp=Extended_Euclid(b,a%b,y,x);
y-=a/b*x;
return temp;
}
long long Inverse_Element(long long a,long long p)
{
long long x,y;
long long d=Extended_Euclid(a,p,x,y);
if(d==1)
return(x%p+p)%p;
else
return -1;
}
参考:https://blog.csdn.net/cai_haiq/article/details/75954298写得相当清楚