题目链接
关键点:
1、ax≡1(modb) 可以转换成 ax+by = 1,那么我们要求的x就可以通过扩展欧几里得算法求出
ll gcd(ll a, ll b, ll &x, ll &y)
{
if (b == 0)
{
x = 1;
y = 0;
return a;
}
ll d = gcd(b, a%b, y, x);//x与y的位置互换
y = y-a/b*x;
return d;
}
那么那些(a,b)!=1的即为无解的
2、如何保证求出的x为最小整数解,因为x要在mod b的条件下最小,那么就将x一直减去b,找到那个刚刚好为正整数的解即可
x = (x%b+b)%b
完整代码:
# include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll t, a, b;
ll gcd(ll a, ll b, ll &x, ll &y)
{
if (b == 0)
{
x = 1;
y = 0;
return a;
}
ll d = gcd(b, a%b, y, x);//x与y的位置互换
y = y-a/b*x;
return d;
}
int main()
{
cin>>t;
while (t--)
{
cin>>a>>b;
ll x, y;
ll d = gcd(a, b, x, y);
if (d != 1)
{
cout<<"-1"<<endl;
}
else
{
cout<<(x%b+b)%b<<endl;
}
}
return 0;
}