公式

Ex - Product Modulo 2 解説 by sugarrr


\(p_1,p_2,p_3,\ldots\) を素数として \(M=p_1^{q_1} p_2^{q_2} p_3^{q_3}\ldots \) と表したとき、\((p_1,q_1),(p_2,q_2),(p_3,q_3),\ldots\) について

\(p\) を素数、\(q\)\(1\) 以上の整数として、以下の条件を満たす長さ \(K\) の数列 \(a\) はいくつあるか? \(\cdots (*)\)

  • すべての \(i(1\leq i \leq K)\) について、\(0\leq a_i \leq p^q - 1\)
  • \(\displaystyle \prod_{i=1}^{K}a_i \equiv N \pmod {p^q}\)

という問題を解きそれぞれの答えを掛け合わせることで、元の問題の答えを求めることができます。

\((*)\) を考えます。\((*)\) の答えを\( F(p,q,K,N)\) とします。

\(N_1\)\(N_2\)\(p\) の冪数が等しいとき、\(F(p,q,K,N_1)=F(p,q,K,N_2)\) が成り立ちます。(帰納法などで示せます。)
よって \(F(p,q,K,N)\) の値の種類数は \(p,q,K\) を固定すると \(O(\log_{ p}N)\) 程度になります。さらに、\(F(p,q,k,n)\)\(F(p,q,k-1,n')\) の線形和で求まるため、行列累乗を用いれば \((*)\) を高速に求めることができます。

以上でこの問題を解くことができました。

補足

実装方針によっては途中で \(p-1\)\(p\) で割る計算が発生しますが、これらが \(998244353\) の倍数だとゼロ除算になってしまうことに注意してください。

投稿日時:
最終更新: