#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long LL;
/*
扩展欧几里得法(求ax + by = gcd)
且|x|+|y|最小。其中d=gcd(a,b)
*/
LL gcd(LL a,LL b,LL &d,LL &x,LL &y)
{
if(!b){d=a;x=1;y=0;}
else{gcd(b,a%b,d,y,x);y-=x*(a/b);}
}
// 求逆元 ax = 1(mod n)
LL inv(LL a,LL n)
{
LL d,x,y;
gcd(a,n,d,x,y);
return d==1?(x+n)%n:-1;
}
int main()
{
LL n,m,k;
while(~scanf("%I64d%I64d",&m,&n))
{
k=inv(m,n);
printf("%I64d\n",k);
}
return 0;
}
51nod1256 乘法逆元
最新推荐文章于 2019-10-26 18:22:55 发布