Problem:
Score : 300 points

Problem Statement

Snuke has a fair N-sided die that shows the integers from 1 to N with equal probability and a fair coin. He will play the following game with them:

Throw the die. The current score is the result of the die.

As long as the score is between 1 and K-1 (inclusive), keep flipping the coin. The score is doubled each time the coin lands heads up, and the score becomes 0 if the coin lands tails up.

The game ends when the score becomes 0 or becomes K or above. Snuke wins if the score is K or above, and loses if the score is 0.

You are given N and K. Find the probability that Snuke wins the game.

Constraints

1 ≤ N ≤ 10^5

1 ≤ K ≤ 10^5

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N K

Output

Print the probability that Snuke wins the game. The output is considered correct when the absolute or relative error is at most 10^{-9}.

Sample Input 1

3 10

Sample Output 1

0.145833333333

If the die shows 1, Snuke needs to get four consecutive heads from four coin flips to obtain a score of 10 or above. The probability of this happening is \frac{1}{3} \times (\frac{1}{2})^4 = \frac{1}{48}.

If the die shows 2, Snuke needs to get three consecutive heads from three coin flips to obtain a score of 10 or above. The probability of this happening is \frac{1}{3} \times (\frac{1}{2})^3 = \frac{1}{24}.

If the die shows 3, Snuke needs to get two consecutive heads from two coin flips to obtain a score of 10 or above. The probability of this happening is \frac{1}{3} \times (\frac{1}{2})^2 = \frac{1}{12}.

Thus, the probability that Snuke wins is \frac{1}{48} + \frac{1}{24} + \frac{1}{12} = \frac{7}{48} \simeq 0.1458333333.

Sample Input 2

100000 5

Sample Output 2

0.999973749998

Solution in Go (1.6) (judge verdict: Accepted)

package main

import (
  "fmt"
)

func check_fact(i int, j int) uint{ //i*2**k がjを初めて超えるkを求める
  var k uint
  k = 0
  // fmt.Println(i,j)
  for {
    // fmt.Println(k)
    if i*(2<<k) >= j{
      // fmt.Println(i*(2<<k),j)
      // fmt.Println(k)
      return k+1
    }
    k++

  }
}

func main(){
  var N, K int
  fmt.Scan(&N, &K)

  // fmt.Println(check_fact(1,17))
  var result float64
  if N < K{
    for i:=1; i<=N; i++{
      k := check_fact(i, K)
      // fmt.Println(i,k)
      // fmt.Println(1/float64((2<<(k-1))*N))
      result += 1/float64((2<<(k-1))*N)
    }
    fmt.Println(result)
  }else{
    for i:=1; i<K; i++{
      k := check_fact(i, K)
      // fmt.Println(i,k)
      // fmt.Println(1/float64((2<<(k-1))*N))
      result += 1/float64((2<<(k-1))*N)
    }
    result += float64(N-K+1)/float64(N)
    fmt.Println(result)
  }
}