この記事で使うアルゴリズム
累積和
はじめに
カテゴリー競プロ初中級者100問では、Qiitaにて@e869120さんがレッドコーダーが教える、競プロ・AtCoder上達のガイドライン【中級編:目指せ水色コーダー!】としてまとめられている100問をPythonで解いています。
全問題の一覧はこちらです
問題
https://atcoder.jp/contests/s8pc-1/tasks/s8pc_1_e
この問題では巨大な数の冪剰余の計算が求められます。
方針
- 冪剰余を求める
pow(m,n)%MODのnが巨大である場合、高速に計算する方法があります。こちらの記事で解説しています。Pythonでは標準で実装されおり、pow(m,n,MOD)とすれば良いです。
- 累積和を求める
- 仮想的な街
0を考え、街0から任意の街iまでの距離を事前に計算しておきます(acc[i-1]とする)。そうすることで、任意の街(i,j)の間の距離をabs(acc[i-1]-acc[j-1])のように計算量O(1)で求められます。 - 標準モジュールの
itertools.accumulateが適当でしょう。
- 仮想的な街
コード
1 | from itertools import accumulate |
記事情報
- 投稿日:2020年4月30日
- 最終更新日:2020年5月8日