D - Prime Sum Game Editorial by Mitsubachi

Bonus の解説

Bonus の解説を書きます。( おそらく合っていると思いますが、間違っていたらすいません。 ) 入力における $B+D$ の最大値より大きい最小の素数を $N$ とし、テストケースの数を $T$ とします。

まず $f(i)$ を以下のように定めます。

  • $i$ が素数のとき : $- \infty$
  • $i$ が素数でないとき : $i$ より大きい最小の素数を $p$ として、 $f(i)=p-i$
$O(N \log \log N)$ でエラトステネスの篩を用いて $N$ 以下の素数を全て求めた後、 $i$ が大きい順に $f(i)$ を求めていけば $f(1)$ から $f(N)$ は $O(N)$ で求まります。
この処理を前準備として行います。

さて、入力 $A,B,C,D$ について $A,B$ に $C$ を足し、 $C,D$ から $C$ を引いた としても答えは変わりません。以下この変形を行ったものとして考えます。
高橋君が整数 $i$ を選んで勝てるとき、その $i$ について$f(i) > D$ が成立します。よって、 $A \leq i \leq B$ の中で$f(i) > D$ となるような $i$ があるか判定すればよく、 $\max \left( f(A),f(A+1), \cdots , f(B) \right) > D$ であるかに帰着できます。

よって、 \(f(i)\)\(O(N \log N)\) でSparse Tableに乗せることで各テストケースを \(O(1)\) で処理できます。
以上より \(O(N \log N +T)\) でこの問題を解くことができました。 \(B+D \leq 2 \times 10^5\) より \(N \leq 2 \times 10^5 +3\) なので十分高速だと思います。 \(f(i)\) をsegment treeに乗せて各テストケースを \(O( \log N)\) で処理した場合の \(O(N \log \log N + T \log N)\) でも余裕だと思います。

posted:
last update: