#include <iostream>
#include <cmath>
using namespace std;
typedef long long ll;
inline long long read()
{
long long s=0,f=1;
char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)) {s=s*10+ch-'0'; ch=getchar(); }
return s*f;
}//快读
inline void write(long long x)
{
if(x<0) {putchar('-');x=-x;}
if(x>9) write(x/10);
putchar(x%10+'0');
return;
}//快写
void exgcd(ll a,ll b,ll &x,ll &y)
{
if(b==0)
{
x=1;
y=0;
return ;
}
exgcd(b,a%b,x,y);
ll temp=x;
x=y;
y=temp-a/b*y;
}
ll gcd(ll a,ll b)
{
return b==0?a:gcd(b,a%b);
}
int main(){
int t;
cin>>t;
while(t--){
ll a,b,c,x,y;
a=read();
b=read();
c=read();
ll gcdd = gcd(a, b);
if(c % gcdd != 0){
puts("-1");
continue;
}
a /= gcdd;
b /= gcdd;
c /= gcdd;//此时gcd(a, b) = 1
exgcd(a, b, x, y);//求ax + by = 1的解
x *= c;
y *= c;//这样x,y就是ax + by = c 的解
//以下都是对a(x + tb) + b(y - ta) = c的应用
if(x <= 0){//如果x<=0那么求x的最小正整数值
ll t = abs(x) / b + 1;
x = x % b + b;
y -= t * a;
if(y <= 0)//x是最小正整数解,y<=0,说明有整数解没有正整数解,输出x的最小正整数值,y的最小正整数值。
{
write(x);
printf(" ");
y = y % a + a;
write(y);
printf("\n");
continue;
}
}
if(y <= 0){//同上
ll t = abs(y) / a + 1;
y = y % a + a;
x -= t * b;
if(x <= 0){
x = x % b + b;
write(x);
printf(" ");
write(y);
printf("\n");
continue;
}
}
ll maxx, minx, maxy, miny, p, q;
p = x / b;//计算x的最小值,同时y取最大值
x %= b;
if(!x) x += b,p--;
y += p * a;
minx = x;
maxy = y;
q = y/a;
y %= a;
if(!y) y+=a,q--;
x += q * b;
miny = y;
maxx = x;
printf("%d %d %d %d %d\n", (maxx - minx) / b + 1, minx, miny, maxx, maxy);
}
return 0;
}
洛谷 P5656
最新推荐文章于 2024-06-17 22:13:25 发布