社区讨论
救救孩子吧
P5656【模板】二元一次不定方程 (exgcd)参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @m1qfd9h1
- 此快照首次捕获于
- 2024/10/01 20:38 去年
- 此快照最后确认于
- 2025/11/04 18:22 4 个月前
CPP
#include <bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
int t, a, b, c, x, y;
int exgcd(int a, int b)
{
// if(a < b)
// {
// swap(a, b);
// }
if(b == 0)
{
x = 1;
y = 0;
return a;
}
int d = exgcd(b, a % b);
int t = x;
x = y;
y = t - (a / b) * y;
return d;
}
int ce(int p, int q)
{
return (int)((p + q - 1) / q);
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> t;
while(t--)
{
cin >> a >> b >> c;
// gcd x0 y0
// int gcd = exgcd(max(a, b), min(a, b));
int gcd = exgcd(a, b);
// cout << " x == " << x << ", y == " << y << endl;
if(c % gcd) // 没有整数解
{
cout << -1 << endl;
// cout << endl;
continue;
}
// cout << " gcd == " << gcd << endl;
// x1 y1
x *= (c / gcd);
y *= (c / gcd);
// cout << " x == " << x << ", y == " << y << endl;
// step
int dx = b / gcd;
int dy = (a / gcd);
// min/maxr
int l = ce((-x) / dx);
int r = (int)(y / dy);
if(l > r) // 没有正整数解
{
cout << x + l * dx << " " << y - r * dy << endl;
// cout << endl;
continue;
}
// 有正整数解
int mxx = x + r * dx;
int mxy = y - l * dy;
int mnx = x + l * dx;
int mny = y - r * dy;
cout << (r - l + 1) << " " << mnx << " " << mny << " " << mxx << " " << mxy << endl;
x = 0;
y = 0;
// cout << endl;
}
return 0;
}
样例没过
回复
共 0 条回复,欢迎继续交流。
正在加载回复...