参考:
https://blog.csdn.net/rising_fallmoon/article/details/10724239
ax+by = gcd(a, b)这个公式一定有解:
void extend_Eulid(ll a, ll b, ll &x, ll &y, ll &d)
{
if (!b)
{
d = a;
x = 1;
y = 0;
}
else
{
extend_Eulid(b, a % b, y, x, d);
y -= x * (a / b);
}
}
ll ex_gcd(ll a,ll b,ll &x,ll &y)
{
if(b==0)
{
x=1;
y=0;
return a;
}
ll r=ex_gcd(b,a%b,x,y);
ll t=x;
x=y;
y=t-a/b*y;
return r;
}
//ax=b(mod n)
bool modular_linear_equation(ll a,ll b,ll n)
{
ll x,y,x0,i;
ll d=ex_gcd(a,n,x,y);
if(b%d!=0)
return false;
x0=x*(b/d)%n; //特解
for(i=1; i<d; i++) //解的个数是d
printf("%d\n",(x0+i*(n/d))%n);
return true;
}
通解就是:
x = x0 + (b/gcd)*t
y = y0 – (a/gcd)*t