(備忘録)AtCoderをやって12(Dice and Coin)

問題

下記参照

atcoder.jp

自分の回答(不正解)

N, K = gets.chomp.split.map(&:to_i)
arr = []
i = N + 1
if N <= K
  # 分からなかった
else
  (1..N).each do |n|
  if n == 1
    probability = Rational(1, N) * Rational(1, 2)**(i)
    arr << probability
  else
    probability = Rational(1, N) * Rational(1, 2)**(i)
    arr << probability
  end
  i -= 1
  end
end
result = arr.sum
puts result.numerator / result.denominator

模範回答

tmpはサイコロの目の数。1からn面までのサイコロの目を検証。

n,k = gets.split.map(&:to_i)
ary = []
1.upto(n) do |i|
  tmp = i
  cnt = 0
  while tmp < k do
    tmp *= 2
    cnt += 1
  end
  ary << 1/(n.to_f) * 1/(2.to_f**cnt)
end
puts ary.sum