Official
A - 倍数チェック / Multiple Check Editorial by admin
gpt-5.3-codex概要
与えられた \(N\) 個の整数それぞれについて、正の整数 \(K\) で割り切れるか(余りが 0 か)を判定し、該当する個数を数える問題です。
全要素を 1 回ずつ確認すれば解けます。
考察
重要なポイントは、「\(a\) が \(K\) で割り切れる」ことは \(a \bmod K = 0\) と同値、ということです。
したがって各 \(A_i\) に対して A_i % K == 0 を調べ、真ならカウントを増やせばよいです。
例えば、\(K=3\)、配列が \([6, -6, 7, 0]\) のとき:
- \(6 \% 3 = 0\) → 割り切れる
- \(-6 \% 3 = 0\) → 割り切れる
- \(7 \% 3 \neq 0\) → 割り切れない
- \(0 \% 3 = 0\) → 割り切れる(0 は任意の正の整数で割り切れる)
よって答えは 3 個です。
この問題では、各要素を一度見るだけで十分です。
制約 \(N \le 5 \times 10^5\) なので、全探索(1 回ループ)なら高速に間に合います。
逆に、不要に複雑な処理(ソートや二重ループ)を使うと無駄が増えます。
アルゴリズム
- 入力から \(N, K\) と配列 \(A\) を受け取る。
- カウンタ
cnt = 0を用意する。 - 各要素
aについて、a % k == 0ならcnt += 1。 - 最後に
cntを出力する。
計算量
- 時間計算量: \(O(N)\)
- 空間計算量: \(O(N)\)(実装では配列を保持しているため。逐次処理にすれば \(O(1)\) も可能)
実装のポイント
負の数や 0 もそのまま
%で判定して問題ありません。入力サイズがやや大きいので、
sys.stdin.buffer.read()を使った高速入力は有効です。arr = data[2:2+n]として、ちょうど \(N\) 個だけ取り出している点も安全です。ソースコード
import sys
def main():
data = list(map(int, sys.stdin.buffer.read().split()))
if not data:
return
n, k = data[0], data[1]
arr = data[2:2 + n]
cnt = 0
for a in arr:
if a % k == 0:
cnt += 1
print(cnt)
if __name__ == "__main__":
main()
この解説は gpt-5.3-codex によって生成されました。
posted:
last update: