公式
G - Doubles 解説
by
G - Doubles 解説
by
kyopro_friends
\(S=\sum_i K_i\) とします。
あらかじめ、各サイコロ \(i\) について
\(\mathrm{count}_i[X]=サイコロ i の面のうち、Xが書かれているものの個数\)
という連想配列を用意します。これは全ての \(i\) について合計で \(O(S\log S)\) 時間でできます。
\(2\) つのサイコロ \(i,j\) を振ったときに同じ目が出る確率を考えます。これは、サイコロ \(i\) の各目 \(X\) に対してサイコロ \(j\) が \(X\) の面を何個持つかがわかればよいため、連想配列 \(\mathrm{count}_j\) を用いることで \(O(K_i \log K_j)\) 時間で求めることができます。
よって \(2\) つのサイコロの選び方を全探索することで、\(\sum_{i,j} O(K_i \log K_j)=O(NS\log S)\) 時間で答えを求めることができます。
計算
\(K_i \log K_j \leq K_i \log S\) なので、
\(\sum_{i,j} O(K_i \log K_j)\\
\subset \sum_{i,j}O(K_i \log S)\\
\subset \sum_{j}O(S \log S)\\
\subset O(NS \log S)\)
投稿日時:
最終更新: