ax 1 +by 1 =ax 2 +by 2

a(x 1 -x 2 )=b(y 2 -y 1 )

然后我们知道gcd(a,b)为a,b的最大公因数,所以我们将 A=a/gcd(a,b),B=b/gcd(a,b),接着往下推出

A(x 1 -x 2 )=B(y 2 -y 1 )

现在A和B两个已经是 互素 了,所以又可以接着推出

(这个地方要好好理解,重点! )

A*(n*B)=B*(n*A)

(x 1 -x 2 )=n*B

(y 2 -y 1 )=n*A

这里我们从x入手

(x 1 -x 2 )=n*B

x 1 =x 2 +n*B

由此,我们推出了x解的通解公式 x=x 0 +n*B

同理,我们推出了y解的通解公式 y=y 0 -m*A

那么我们如果要求 x 的最小整数解,也就是 x 0 , 就是 x 0 =x%B

如果我们要求的是  ax+by=c,还得 先转化  x=x*c/gcd(a,b).

然后套入我们的公式

B=b/gcd(a,b)

x 0 =x%(b/gcd(a,b))

嗯,到此结束,下面给下实现代码

#include <bits/stdc++.h>
#include<unordered_set>
//freopen("in.txt", "r", stdin);
using namespace std;
typedef double dou;
typedef long long ll;
typedef pair<ll, ll> pii;
#define M 1050
#define inf 0x3f3f3f3f
#define mod 1000000007
#define W(a) while(a)
#define lowbit(a) a&(-a)
#define left k<<1
#define right k<<1|1
#define ms(a,b) memset(a,b,sizeof(a))
#define debug(a) cout<<#a<<" == "<<a<<endl
#define false_stdio ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
ll exgcd(ll a, ll b, ll &x, ll &y) {
    if (!b) {
        x = 1, y = 0;
        return a;
    ll ans = exgcd(b, a%b, y, x);
    y -= a / b * x;
    return ans;
ll solve(ll a, ll b, ll c) {
    ll x, y, z;
    z = exgcd(a, b, x, y);
    if (c%z)return -1;//不成立
    //return x; //不需要最小正整数的话直接返回x
    x *= c / z;
    b = abs(b / z);
    return (x%b + b) % b;
int main() {
    false_stdio;
    ll a, b, c;
    cin >> a >> b >> c;
    ll x = solve(a, b, c);
    ll y = (c - x * a) / b;
    if(x>=0)//看x大小要求而定
        cout << x << ' ' << y << endl;
    return 0;