题解:P5656 【模板】二元一次不定方程 (exgcd)
解析
由裴蜀定理可知一定有一组
恭喜你已经会了第一步,成功的掌握了前置知识,现在我们继续研究,先从求解
相信聪明的你一定会辗转相除求 gcd 吧,我们来模拟一下这个过程,假设现在有
第一轮:
第二轮:
第三轮:
第四轮:
第五轮:
我们回头再看每一轮的操作,假设现在的第一个数为
现在假设存在另外一组
考虑
再考虑
那么解的个数是多少呢? 因为
最后一步,判定是否无正整数解,不难发现,若
最后代码奉上:
#include <bits/stdc++.h>
#define int long long
#define double long double
using namespace std;
int aa, bb, cc, ans = 0, jx = 0, jy = 0;
int x, y = 0;
void exgcd(int a, int b, int xa, int ya, int xb, int yb){//求一组特殊解
if(b == 0){
ans = a;
jx = -xa;
jy = -ya;
return ;
}
else{
int k = a / b;
exgcd(b, a % b, xb, yb, xa - k * xb, ya - k * yb);
}
}
signed main()
{
int T = 0;
cin >> T;
for(int t = 1; t <= T; t++){
cin >> aa >> bb >> cc;
exgcd(aa, bb, -1, 0, 0, -1);
if(cc % ans != 0){//判定无解
cout << -1 << endl;
continue;
}
aa = aa / ans;//化为最简式
bb = bb / ans;
cc = cc / ans;
jx = jx * cc;
jy = jy * cc;
double ka = ceil((1.0 - jx) / bb);
int xmin = jx + bb * ka;
double kb = floor((jy - 1.0) / aa);
int ymin = jy - aa * kb;
int xmax = (cc - bb * ymin) / aa;
int ymax = (cc - aa * xmin) / bb;
if(xmax <= 0){//判定无正整数解
cout << xmin << ' ' << ymin << endl;
continue;
}
else{
cout << (ymax - 1) / aa + 1 << ' ' << xmin << ' ' << ymin << ' ' << xmax << ' ' << ymax << endl;
}
}
return 0;
}
本人第一次写题解,管理大大求过 QwQ。
具体哪里有错说一下吧QwQ