#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair <int,int> pii;
#define mem(s,t) memset(s,t,sizeof(s))
#define D(v) cout<<#v<<" "<<v<<endl
#define inf 0x3f3f3f3f
#define pb push_back
//#define LOCAL
const int mod=1e9+7;
const int MAXN =2e5+10;
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int exgcd(int &x,int &y,int a,int b){
if(!b){
x=1;y=0;
return a;
}
int r=exgcd(x,y,b,a%b);
int t=x;
x=y;
y=t-a/b*y;
return r;
}
bool line_equation(int &x,int &y,int a,int b,int c){//不定方程 ax+by=c 的一组解
int d=exgcd(x,y,a,b);
if(c%d) return false;
int k=c/d;
x*=k;
y*=k;
return true;
}
int main() {
#ifdef LOCAL
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
int x,y,a=3,b=4,c=5;
if(line_equation(x,y,a,b,c)){
cout<<x<<y<<endl;
}
}
另外 根据神奇的拉梅定理(看不懂) gcd的复杂度是 logn的 所以没有必要去纠结递归复杂度,几乎可以忽略。
通解求法:
p * a+q * b = c的其他整数解满足:
p = p1 + b/Gcd(a, b) * t
q = q1 - a/Gcd(a, b) * t(其中t为任意整数)
p 、q就是p * a+q * b = c的所有整数解。