对于一个方程:ax+by=c求通解,其有解的充要条件是<=>gcd(a,b)|c,如果等式成立;
我们可以先求ax+by=gcd(a,b),然后让x,y扩大c/gcd(x,y)倍。
得到方程特解x1,y1之后,我们可以先求ax+by=0的通解,x=k*b/gcd(a,b),y=-k*a/gcd(a,b);(没有比b/gcd(a,b),a/gcd(a,b)让等式成立更小的系数)。
ax+by=c通解为x=x1+k*b/gcd(a,b),y=y1-k*a/gcd(a,b)。
对于x,设mod=b/gcd(a,b),其最小正整数解为(x1%mod+mod)%mod;
代码:
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
#define LL long long
LL a,b,c,x,y,d;
LL exgcd(LL a,LL b,LL &x,LL &y)
{
if(!b)
{
x=1,y=0;
return a;
}
LL d=exgcd(b,a%b,y,x);
y-=a/b*x;
return d;
}
int main()
{ cin>>a>>b>>c;
LL d=exgcd(a,b,x,y);
x=x*c/d;
LL mod=b/d;
cout<<(x%mod+mod)%mod<<endl;
return 0;
}