D - サイコロ Editorial
by
AngrySadEight
サイコロの出目は,\(1, 2, 3, 4, 5, 6\) のいずれかです.そのため,サイコロの出目の総積において,含まれる素因数は \(2, 3, 5\) のみとなります.したがって,\(D\) の素因数に \(2, 3, 5\) 以外のものが含まれる場合は答えは \(0\) となります.以下,そうでない場合を考えます.
\(dp[i][j][k][l] =\) (\(i\) 回サイコロを投げ終わった時点で,出目の総積における素因数 \(2\) の個数が \(j\),\(3\) の個数が \(k\),\(5\) の個数が \(l\) である確率) という DP を考えます.ここで,\(D\) が \(D = 2^{p_2}3^{p_3}5^{p_5}\) と素因数分解できるとすると,素因数 \(2, 3, 5\) の個数が \(p_2, p_3, p_5\) 以上である部分については同一視してよく,DP テーブルとしてはそこまでを持てば十分です.
最初はどの素因数の個数も \(0\) なので,\(dp[0][0][0][0] = 1\) と初期化できます.また,遷移については,どの目が出たかを考えることで
- \(dp[i + 1][j][k][l] \leftarrow dp[i + 1][j][k][l] + dp[i][j][k][l] \times \dfrac{1}{6}\)(出目が \(1\) のときに対応)
- \(dp[i + 1][\min(j + 1, p_2)][k][l] \leftarrow dp[i + 1][\min(j + 1, p_2)][k][l] + dp[i][j][k][l] \times \dfrac{1}{6}\)(出目が \(2\) のときに対応)
- \(dp[i + 1][j][]min(k + 1, p_3)][l] \leftarrow dp[i + 1][j][\min(k + 1, p_3)][l] + dp[i][j][k][l] \times \dfrac{1}{6}\)(出目が \(3\) のときに対応)
- \(dp[i + 1][\min(j + 2, p_2)][k][l] \leftarrow dp[i + 1][\min(j + 2, p_2)][k][l] + dp[i][j][k][l] \times \dfrac{1}{6}\)(出目が \(4\) のときに対応)
- \(dp[i + 1][j][k][\min(l, p_5)] \leftarrow dp[i + 1][j][k][\min(l, p_5)] + dp[i][j][k][l] \times \dfrac{1}{6}\)(出目が \(5\) のときに対応)
- \(dp[i + 1][\min(j + 1, p_2)][\min(k + 1, p_3)][l] \leftarrow dp[i + 1][\min(j + 1, p_2)][\min(k + 1, p_3)][l] + dp[i][j][k][l] \times \dfrac{1}{6}\)(出目が \(6\) のときに対応)
の \(6\) 通りを考えればよいです.\(dp[N][p_2][p_3][p_5]\) が答えです.
状態数が \(O(Np_2p_3p_5)\),遷移が \(O(1)\) なので,計算量は \(O(Np_2p_3p_5)\) となります.実際,制約下において,DP テーブルの大きさ \((p_2 + 1)(p_3 + 1)(p_5 + 1)\) が最大となるのは,\(D = 979552051200000000\) のときの \((p_2 + 1)(p_3 + 1)(p_5 + 1) = 2700 (p_2 = 19, p_3 = 14, p_5 = 8)\) なので,この解法は十分高速に動作します.
posted:
last update:
