けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

yukicoder No.2410 Nine Numbers

平衡三進法!

問題概要

次の条件を満たすサイズ 9 の整数列  A_{1}, A_{2}, \dots, A_{9} を求めよ。

  •  1 \le A_{i} \le 9000 である
  •  1 以上  9000 以下の任意の整数  x に対して、次の操作を繰り返す操作列が存在して、整数列中に整数  x が存在する状態にできる
    • 操作 1:数列から 2 つの要素  a, b を選び、その 2 つの整数を削除して、末尾に  a + b を挿入する
    • 操作 2:数列から 2 つの要素  a, b を選び、その 2 つの整数を削除して、末尾に  a - b を挿入する

解法

つまり、 A_{1}, A_{2}, \dots, A_{9} に対して、 -1, 0, 1 のいずれかを掛けて足した値が連続する整数を表せるようにしたいということ。

となると、平衡三進法しかない!! 次のことがよく知られている。


 1, 3, 9, 27, 81, \dots, 3^{n-1} について、 -1, 0, 1 のいずれかを掛けて足すことで、 -\frac{3^{n}-1}{2} 以上  \frac{3^{n}-1}{2} 以下の整数をすべて表すことができる


よって、今回の問題についても、 3^{0}, 3^{1}, \dots, 3^{8} を出力すればよい。

コード

#include <bits/stdc++.h>
using namespace std;

int main() {
    long long res = 1;
    for (int i = 0; i < 9; ++i) {
        cout << res << " ";
        res *= 3;
    }
    cout << endl;
}