No.2176 LRM Question 1 解説

まだ一般公開されていません。 2023-01-06 23:50:00 +0900 JSTに公開される予定です。 ACを取っていると見ることが出来ます。

解説

f(L,R)=n=LR(i=1n(j=1ij))\displaystyle f(L,R) = \sum_{n=L}^{R} \left( \prod_{i=1}^{n} \left( \prod_{j=1}^{i} j \right) \right), an=i=1ni\displaystyle a_{n} = \prod_{i=1}^{n} i, bn=i=1nai\displaystyle b_{n} = \prod_{i=1}^{n} a_{i} とします。

本問の答えである f(L,R)f(L,R) の値を愚直に求めようとすると、処理全体で要する計算量は N=RLN = R - L として O(NR2)O(N R^2) であり、
今回の制約は 1LR10181 \leq L \leq R \leq 10^{18} なので TLE となる可能性があります。

そのため、次のように計算方法を工夫する必要があります。

まず、an,bna_{n}, b_{n} の計算方法に着目すると、任意の正整数 nn に対して、

  • an+1=(n+1)ana_{n+1} = (n+1) a_{n}

  • bn+1=an+1bnb_{n+1} = a_{n+1} b_{n}

であることが分かるので、各 nn について直前の nn における計算結果を利用することにより、an,bna_{n}, b_{n} は高速に計算できます。

よって、先の計算量は O(NR2)O(N R^2) から O(R)O(R) に落とせますが、RR の値は非常に大きい可能性があるので、これだけでは不十分です。

そこで、an,bna_{n}, b_{n} について次が成り立つことを利用します。

  • nnMM 以上の整数ならば、an,bna_{n}, b_{n} はともに MM の倍数である。

この事実から、f(L,R)f(L,R) の計算において、MM 以上の nn に関する項を MM で割った余りはすべて 00 となるため、これらの総和は無視しても良いです。

以上より、本問の答えを求める処理全体で要する計算量は N=min(M,R)N^{*} = \min(M, R) として O(N)O(N^{*}) であり、本問では 1M1061 \leq M \leq 10^{6} なので十分高速です。


想定解

解答例 (C++17) AC
解答例 (PyPy3) AC

他の解説ページへのリンク

このリンクは、ユーザーが自由に登録できるため、Writerが追加しているわけではありません。
以下のいずれかに該当するページは削除対象ですので、見つけたら報告のご協力をお願いします
将来yukicoder上でも削除申請機能を提供したいです。

  • 問題に関係ないページ
  • 問題・解説に対して、不快な文面(不快の定義は難しいので、難しい場合はアンケートなどを取る可能性はあります)

MasKoaTSさんが、このページの解説文を書きました。