GCD Problem
题目链接
给定一个正整数 n,请找出一组互不相同的正整数 a,b,c,使得:
- a+b+c=n。
- gcd(a,b)=c。
数据范围:t 组数据,1⩽⩽t⩽105,10⩽⩽n⩽109。
题解
我们不妨钦定 c=1,即 a,b 互质,然后上一波分类讨论:
- 2∣n,此时即可构造出 (n-1)/2,n/2,c=1 的一组解。
- 2∤n,那么我们减去一个 11 之后发现,要使 a,b 均为奇数(相邻奇数互质),则仍有不同种情况,于是继续分类讨论:
- 4∣(n−1),此时 (n-1)/2为偶数 , 即可构造出 a=(n−1)/2−1,b=(n−1)/2+1,c=1 的一组解。
- 4∤(n−1),此时 (n-1)/2为奇数 ,即可构造出 a=(n−1)/2−2,b=(n−1)+2,c=1 的一组解。
#include<iostream>
using namespace std;
int t,a,b,c,n;
int main()
{
cin>>t;
for(int i=1; i<=t; i++)//共有 t 次。
{
cin>>n;
c=1; //无论如何,我们选择的结果 c 总是 1。
if(n%2==0) //第一种情况:
{
a=n/2-1;
b=n/2;
}
else if((n-1)%4==0) //第二种情况:
{
a=(n-1)/2-1;
b=(n-1)/2+1;
}
else //第三种情况:
{
a=(n-1)/2-2;
b=(n-1)/2+2;
}
cout<<a<<' '<<b<<' '<<c<<endl;
} //输出。
return 0; //完美地结束啦!
}