牛客新生赛 D.不定方程(数学gcd)

题目链接:点击这里
牛客新生赛 D.不定方程(数学gcd)_第1张图片

根据题意,给定 a , b a,b a,b的情况下, c m i n c_{min} cmin即为 a , b a,b a,b的最小公倍数, 即 a ⋅ b / g c d ( a , b ) a\cdot b/gcd(a,b) ab/gcd(a,b),于是有 x = b / g c d ( a , b ) x=b/gcd(a,b) x=b/gcd(a,b) y = a / g c d ( a , b ) y=a/gcd(a,b) y=a/gcd(a,b),可见 x , y x,y x,y一定是互质的,即 g c d ( x , y ) = 1 gcd(x,y) = 1 gcd(x,y)=1

现在给出 x , y x,y x,y,判断它们是否满足一组 a x = b y = c m i n ax=by=c_{min} ax=by=cmin,其中 c m i n c_{min} cmin为该不定方程所有可能的的解中最小的一个。

此时只需要判断 g c d ( x , y ) gcd(x,y) gcd(x,y)是否为1,并令 a = y , b = x a=y,b=x a=y,b=x即可构造出答案。

注意因为 x , y x,y x,y最大会到 1 0 5 10^5 105,所以两者之积有可能超过int的范围。

#include
#include
#include
#include
#include
#include
#include
#include

using namespace std;
typedef long long ll;
const int MOD = 10000007;
const int INF = 0x3f3f3f3f;
const double PI = acos(-1.0);
const int maxn = 300;

ll gcd(ll a, ll b)
{
	return b==0 ? a : gcd(b, a%b);
}

int main()
{
	int t;
	ll x, y;
	scanf("%d", &t);
	while(t--)
	{
		scanf("%lld%lld", &x, &y);
		if(gcd(x,y)==1)
			printf("%lld %lld %lld\n", y, x, x*y);
		else
			printf("-1\n");
	}
	return 0;
}

你可能感兴趣的:(数论,数学思维)