Official

A - お買い物の合計金額 / Total Shopping Amount Editorial by admin

Gemini 3.0 Flash

概要

\(K\) 個の商品の価格の総和を求め、それを \(M\) で割った余り(ポイント)を計算する問題です。

考察

この問題は、与えられた \(K\) 個の価格 \(L_1, L_2, \ldots, L_K\) をすべて足し合わせ、最後に \(M\) で割った余りを出力するだけで正解が得られます。

制約を確認すると、商品の個数 \(K\) は最大で \(10^5\)、各商品の価格 \(L_i\) は最大で \(10^4\) です。したがって、合計金額の最大値は \(10^5 \times 10^4 = 10^9\) 程度になります。Pythonでは非常に大きな整数も自動的に扱えるため、この合計値をそのまま計算してもオーバーフローの心配はありません。

また、\(K\)\(10^5\) と比較的大きいため、入力を1つずつ処理するよりも、まとめて読み込んで処理する方が実行時間を短縮できます。

アルゴリズム

以下の手順で解くことができます。

  1. \(K\)\(M\) を入力から受け取る。
  2. \(K\) 個の価格 \(L_i\) をリストとして受け取る。
  3. リスト内のすべての要素の合計 \(S\) を計算する。
  4. \(S\)\(M\) で割った余り(\(S \pmod M\))を計算し、出力する。

計算量

  • 時間計算量: \(O(K)\)
    • \(K\) 個の数値を読み込み、それらを一度ずつ走査して合計を求めるため、入力の個数 \(K\) に比例した時間がかかります。
  • 空間計算量: \(O(K)\)
    • 全ての価格 \(L_i\) を一度にリストとして保持する場合、メモリ量は \(K\) に比例します。

実装のポイント

  • 高速な入力: Pythonで大量のデータを読み込む場合、sys.stdin.read().split() を使うことで、標準入力全体を一度に読み込み、スペースや改行で分割したリストを高速に取得できます。
  • 効率的な合計計算: sum(map(int, data)) のように map 関数と sum 関数を組み合わせることで、ループを明示的に書くよりも簡潔かつ高速に合計を求めることができます。

ソースコード

import sys

def main():
    # 標準入力からすべてのデータを読み込み、スペースや改行で分割します
    data = sys.stdin.read().split()
    if not data:
        return
    
    # K: 商品の個数, M: ポイント計算用の除数
    K = int(data[0])
    M = int(data[1])
    
    # L: 各商品の価格(インデックス2以降のデータ)
    # mapを使用して整数に変換し、sumで合計を求めます
    total_price = sum(map(int, data[2:]))
    
    # 合計金額をMで割った余りを出力します
    print(total_price % M)

if __name__ == "__main__":
    main()

この解説は gemini-3-flash-preview によって生成されました。

posted:
last update: