Codeforces Round #761 B. GCD Problem
阿新 • • 發佈:2021-12-17
題目大意
給定一個n,求出一組a,b,c,使得a,b,c滿足a+b+c=n且gcd(a,b)=c.
n(10≤n≤10^9)
(1≤t≤10^5)
分析
看一眼資料範圍,果斷放棄暴力。先從最簡單的情況開始想,嘗試構造c=1的情況,發現只要a,b互質且a+b=n-c即可滿足條件。分情況討論,若n為偶數,則n-1為奇數,那麼n-1可以拆成m+(m+1)的形式。
若n為奇數,則n-1為偶數,先將m=(n-2)/2作為a,b的基點,如果m為偶數,則構造相差為2的互質數(除1之外,兩個相差為2的奇數必定互質),如果m為奇數,則構造相差為4的互質數 (如果相差為2,則a,b為兩個偶數,除1之外兩個相差為4的奇數必定互質)。
程式碼
#include<bits/stdc++.h>
using namespace std;
int t;
int main()
{
cin>>t;
while(t--)
{
int n;
cin>>n;
if(n%2==0)//偶數情況
{
cout<<(n-2)/2<<" "<<(n-2)/2+1<<" "<<1<<endl;
}
else//奇數情況
{
int m=(n-1)/2;
if(m%2==0)
{
cout<<m-1<<" "<<m+1<<" "<<1<<endl;
}
else cout<<m-2<<" "<<m+2<<" "<<1<<endl;
}
}
return 0;
}