解法

概要

の偶奇で場合分け。

詳細

が偶数だとしよう。 先頭が の整数列は 個存在し、先頭が の整数列は 個存在する。 よって求めるのは先頭が の整数列の中で最も大きいもの。 つまり の形。

が奇数だとしよう。 先頭が の整数列と先頭が の整数列はちょうど同数存在する。 よって 番目の整数列の先頭は と分かる。 基本はこれを繰り返して という列である。 しかし 段目以降は という列の影響ですこしずつずれる。 よってこのずれの分で 回だけ をdecrementする必要がある。 decrement部分はならし なので間に合う。

メモ

実装

#include <bits/stdc++.h>
#define REP(i, n) for (int i = 0; (i) < (int)(n); ++ (i))
using namespace std;

vector<int> solve(int k, int n) {
    if (k == 1 and n == 1) {
        return vector<int>(1, 1);

    } else if (k % 2 == 0) {
        // the last sequence starting with k / 2
        vector<int> a(n, k);
        a[0] = k / 2;
        return a;

    } else {
        // basically the sequence whose all elements are k / 2 + 1
        vector<int> a(n, k / 2 + 1);
        REP (i, n / 2) {
            // decrement
            if (a.back() >= 2) {
                -- a.back();
                while (a.size() < n) {
                    a.push_back(k);
                }
            } else {
                a.pop_back();
            }
        }
        return a;
    }
}

int main() {
    int k, n; cin >> k >> n;
    auto a = solve(k, n);
    for (int a_i : a) {
        cout << a_i << ' ';
    }
    cout << endl;
    return 0;
}