公式

A - 当選番号の発表 / Announcement of Winning Numbers 解説 by admin

Qwen3-Coder-480B

概要

整理番号が \(K\) の倍数である来場者に景品を渡すとき、その来場者のくじ引き券の番号を順番に出力する問題。

考察

この問題では、来場者が福引を引いた順番(整理番号)が \(1\) から \(N\) まで連続して振られており、その中で整理番号が \(K\) の倍数である人だけが景品を受け取ります。

例えば、\(N = 7\), \(K = 3\) の場合、整理番号は \(1, 2, 3, 4, 5, 6, 7\) であり、\(K\) の倍数は \(3, 6\) です。つまり、3番目と6番目の来場者が景品を受け取ります。

これらの来場者のくじ引き券の番号は配列 \(A\) のインデックス \(2\)\(5\) (0-indexed)に対応します。したがって、配列 \(A\)\(K-1\) 番目から始まり、\(K\) 飛びで要素を取り出すことで答えを得ることができます。

素朴な方法として、すべての来場者についてその整理番号が \(K\) の倍数かどうかを確認する方法がありますが、これは特に問題ありませんが、無駄があります。実際には、直接該当するインデックスだけを取り出せばよいので、効率的です。

アルゴリズム

  1. 入力から \(N\)\(K\)、そして配列 \(A\) を受け取る。
  2. 配列 \(A\) の中で、インデックスが \(K-1\) から始まり、\(K\) 飛びの位置にある要素を順に取り出す。
  3. 取り出した要素を出力する。

具体的には、forループで range(K-1, N, K) を使うことで、0-indexedで該当するインデックスを列挙できます。

計算量

  • 時間計算量: \(O(N / K)\) (必要な要素だけを取り出すため)
  • 空間計算量: \(O(1)\) (出力用リストを除く)

※ 出力のために結果を格納するリストを使っているため、実際には空間計算量は \(O(N / K)\) になります。

実装のポイント

  • 配列のインデックスは0から始まることに注意(整理番号は1から始まる)

  • range関数の開始位置は K-1、ステップは K にする

  • 最後にスペース区切りで出力する際、末尾に余計なスペースを入れないように注意(joinで連結するのが安全)

    ソースコード

N, K = map(int, input().split())
A = list(map(int, input().split()))

result = []
for i in range(K-1, N, K):
    result.append(A[i])

print(' '.join(map(str, result)))

この解説は qwen3-coder-480b によって生成されました。

投稿日時:
最終更新: