AtCoder Beginner Contest 169 解説

https://atcoder.jp/contests/abc169

C問題

decimalを使えば10進数の小数計算は(28桁まで)誤差なしにできる。使い方を忘れてたので調べた。

from decimal import *

A, B = map(Decimal, input().split())
print(int(A * B))

D問題

p,p^2,p^3,...の順に使うのが最適。

E問題

Aの中央値とBの中央値の間はすべて作れる。奇数個なら1刻み、偶数個なら0.5刻みなので注意。無証明。

F問題

組合せ的な方法があるのかもしれないけど式変形で解いた。dp[いくつ見たか][総和][使った個数]=組合せ数で解けるのは良くて、最終的な答えはすべての$k$に対して$dp[i][j][k] 2^{n-k}$の総和。$ep[i][j][k]=dp[i][j][k]2^{n-k}$と置きなおして漸化式を立てると、

\begin{align}
ep[i][j][k] \to ep[i+1][j][k]
\end{align}

\begin{align}
ep[i][j][k] \to ep[i+1][j + a_i][k + 1] / 2 \\
\end{align}

遷移に$k$を使ってないので$k$は忘れてよくて、$ep[i][j]$だけで解ける。

組合せ的な解 まず部分集合Sを列挙して、さらにSの部分集合Tを列挙する、というのは$3^n$通りの方法がある。n桁の3進数の間に全単射が作れて、

  • ある要素がTに含まれるとき0
  • ある要素がSに含まれるとき1
  • それ以外のとき2

とすればよい。この対応を使えば漸化式を立てることができる。