TDPC D - サイコロ

考え方

ABCでいうと、易しめのE問題級。

出た目の積が $D$ の倍数というのを、出た目の積と $D$ の最大公約数が $D$ そのものになると言い換える。
「今の積と $D$ の最大公約数がいくつになっている確率がいくつか」を DP テーブルに持てばよい。
サイコロを $1$ 回振るごとのテーブル更新は、配るDPの方が楽。
今の最大公約数が $i$ だったら、$i,2i,3i,4i,5i,6i$ それぞれと $D$ の最大公約数に $1/6$ ずつ配ればよい。
これで、サイコロの目の数 $6$ は定数とみなして、$O(ND)$ で解ける。
が、$D$ が $10^{18}$ まであるので、これではメモリも計算量も足りなくなる。

しかし、DPテーブルに意味がある値が入るのは、$D$ の約数のみである。
よって、テーブルを配列でもつのではなく map か何かで持てば高速化される。

素因数を $2,3,5$ しか持たない $D$ の約数の個数を $M$ とすると、計算量は $O(NM\log M)$。
これが最も多いのは $D=2^{19}\times 3^{14}\times 5^8=979552051200000000$ のときの $M=2700$。
よって、十分間に合う。

入力例1での動作

入力を受け取る。

n: 2
d: 6

mp[i] を、ここまでの出目の積と $d$ の最大公約数が $i$ になる確率とする。
最初は出目をまだ掛けていないので、積を $1$ として次の状態から始める。

最大公約数 $1$
$0$ 回振った後 1

$1$ 回目のサイコロを振る。
出目が $1,5$ なら最大公約数は $1$、$2,4$ なら $2$、$3$ なら $3$、$6$ なら $6$ になる。

最大公約数 $1$ $2$ $3$ $6$
$1$ 回振った後 $2/6$ $2/6$ $1/6$ $1/6$

さらに $2$ 回目のサイコロを振る。
$1$ 回目の各結果から同様に最大公約数へ配る DP をすると、次の状態になる。

最大公約数 $1$ $2$ $3$ $6$
$2$ 回振った後 $4/36$ $12/36$ $5/36$ $15/36$

最大公約数が $6$ であることと、出目の積が $6$ の倍数であることは同値である。
したがって、$\frac{15}{36}=0.416666\ldots$ が答え。

注意点

特になし。

別解

特になし。