E - Exponent of PI Editorial
by
maspy
本問題は,\(N=2ABC\) に対する Bernoulli 数 \(B_N\) の計算に帰着されます(\(N\) は \(2^{25}\) 近くになります). \(N\) が巨大ですし \(2^{23}=998244353/119\) を超える長さは FFT のサポート対象外なので大変です.
AC をとることができた公式解説とは異なる方法を 2 つ紹介します.
[1]
素直な形式的べき級数の計算をやろうとします.定義式から \((e^x-1)/x\) の逆元が分かればよいです. \(B_N\) は \(B_1\) を除く奇数次の項が消えることを思い出すと,扱う形式的べき級数の長さを半分にできそうです.これをやります.
\[((e^x-1)/x)^{-1}-(x/2) = (e^x+1)/2((e^x-1)/x) = \bigl(e^{x/2}+e^{-x/2}\bigr)\bigl((e^{x/2}-e^{-x/2})/(x/2)\bigr)\]
です.\(e^t+e^{-t}\) や \((e^t-e^{-t})/t\) には偶数次の項しかないので,これで長さを半分にできます.
\(B_N = [x^{N/2}] f(x)\cdot g(x)^{-1}\) という \(f,g\) が得られました.欲しいものが \([x^{N/2}]\) だけなので最後の畳み込みは不要で,結局 \(g(x)^{-1}\) が計算できればよいことになります.
結局,長さ \(2^{24}\) の fps inv の計算を 4 秒以内にできれば合格という感じの問題だということになります. 長さ \(2^{23}\) までを通常の実装で求めたあと,newton 法の最後の部分を Convolution (Large) の最速実装を借りることで,AC を得ることができます.
解答例(3.86 sec):https://atcoder.jp/contests/xmascon23/submissions/48827297
FFT の回数を節約するタイプの高速化は入れていないので,ちゃんと切り詰めるともう少し余裕が出るのだろうと思います (同じ多項式を 2 回 FFT している場所があることは分かっている).
[2]
検索を頑張ると \(B_N \bmod p\) を \(O(p)\) 時間で計算するアルゴリズムが見つかります.
https://www.ams.org/journals/mcom/2010-79-272/S0025-5718-2010-02367-1/S0025-5718-2010-02367-1.pdf
\(p=998244353\) に対する単純な \(O(p)\) ということで,試しに実装してみると間に合います.
解答例(2.78 sec):https://atcoder.jp/contests/xmascon23/submissions/48828159
指数型母関数 mod \(p\) まわり,\(O(p)\) 的な式ありがちなのかなあ?(不勉強) (Stirling number や Bell number で小さい mod かつ巨大な \(N\) みたいなものの計算とかも見たことがある)
posted:
last update: