Prove Him Wrong-Codeforces
投稿日: 更新日:
問題
個の整数列に対し以下の操作を行います。
- 2つの組を選ぶ
- とする
どのを選んで操作を行ったとしても総和が減少しない(等しいまま、もしくは増加する)個の整数列を作成できるか判定してください。
作成可能ならば出力してください。
解法
総和が減少しないということは以下の不等式を満たします。
とする。
となり、各ペアが3倍以上の差があれば良いことが分かります。
後はより大きくならないように数列を作成していけば良いです。
実装
#include <bits/stdc++.h>
using namespace std;
void solve(){
    int n;
    cin >> n;
    vector<int> ans;
    const int limit = 1e9;
    long long pow3 = 1;
    for(int i = 0;i < n; ++i){
        if(pow3 > limit){
            cout << "NO" << endl;
            return;
        }
        ans.push_back(pow3);
        pow3 *= 3;
    }
    cout << "YES" << endl;
    cout << ans[0];
    for(int i = 1;i < n; ++i){
        cout << " " << ans[i];
    }
    cout << endl;
}
int main(){
    int t;
    cin >> t;
    while(t--){
        solve();
    }
    return 0;
}