1. 程式人生 > 其它 >Codeforces Round #761 B. GCD Problem

Codeforces Round #761 B. GCD Problem

題目大意

給定一個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; }