ebisukeプログラミング初心者脱出黙示録

30歳を過ぎてから始めたプログラミングと競プロの記録。Pythonで取り組んでいます。Arduinoで電子工作も

【AtCoder版!蟻本】AtCoder-ABC084 D - 2017-like Number【エラトステネスの篩】

AtCoder版!蟻本のエラトステネスの篩の例題としてあげられているABC084 D - 2017-like Number をPythonで解いていきます。

ABC084 D - 2017-like Number

D - 2017-like Number

問題文

「N も (N+1)÷2 も素数」を満たす奇数 N を 2017に似た数 とします。

Q 個のクエリが与えられます。

クエリ i(1≦i≦Q) では奇数 l i​ ,r i​ が与えられるので、l i​ ≦ x ≦ r i​ かつ 2017に似た数 となる奇数 x の個数を求めてください。

制約

・1≦Q≦10^5
・1 ≦ l i​ ≦ r i​ ≦ 10^5
・l i​ ,r i​ は奇数
・入力は全て整数

解答例


解説

「N も (N+1)÷2 も素数」を満たす奇数 N を 2017に似た数 として、与えられたQ個のクエリについてLi <= x <= Riかつ2017に似た数となるxの個数を答える問題です。

まずエラトステネスの篩でriの最大値10^5までの素数をprime配列に列挙します。
エラトステネスの篩はこちらのページで記載しましたので参照してください。
ebisuke33.hatenablog.com

次に2017に似た数字の数を調べるためlike2017配列を作成し、primeに格納された数が2017に似た数か判定しました。

tmpに(N+1)÷2 を代入し、このtmpがprime配列にあれば2017に似た数なのでprime配列の該当する要素に1を足します。

2017に似た数字を調べ終えると、変数sumに累積和をとりlike2017配列をsumで更新しました。

最後に各クエリに対して、riまでの累積和num_rから li - 1までの累積和num_lを引けば求める解答です。






AtCoder版!蟻本(初級編)の記事リンクページはこちら
ebisuke33.hatenablog.com