如何解方程$$axequiv b({ m mod} m)$$呢?因为$ax-b|m$, 故令$ax-b=-ym$,即$$ax+my=b$$。根据Bezout定理,该方程有解当且仅当$gcd(a,m)|b$。我们把等式两边同乘以$frac{gcd(a,m)}{b}$,得到$$ax_0+my_0=gcd(a, m)$$。这个方程可以用扩展欧几里得算法求得得到$x_0$。等式是怎么乘的,就再把它除回来,也就是$$x=x_0cdot frac{b}{gcd(a,m)}$$。关于方程的通解,$$ax+k{ m lcm}(a,m)+my-k{ m lcm}(a,m)=b,{ m lcm}(a,m)=frac{am}{gcd(a,m)}$$,也就是$$a(x+kfrac{m}{gcd(a,m)})+m(y+kfrac{a}{gcd(a,m)})=b$$,所以方程的通解为所有与$x$同余$frac{m}{gcd(a,m)}$的数。若要求最小正整数解,令$p=frac{m}{gcd(a,m)}$,然后x=(x%p+p)%p即可。
ll Exgcd(ll a, ll b, ll &x, ll &y) { if (b == 0) { x = 1; y = 0; return a; } ll d = Exgcd(b, a%b, x, y); ll tx = x; x = y; y = tx - (a / b) * y; return d; } ll Gcd(ll a, ll b) { return b ? Gcd(b, a%b) : a; } ll Eq(ll a, ll b, ll m) { ll gcd = Gcd(a, m); if (b%gcd) return -1; ll x, y; Exgcd(a, m, x, y); x = x * b / gcd; ll p = m / gcd; return (x%p+p) % p; }