Problem:
賞金 (Prize)

Segtree くんは、 $N$ 人のチームでプログラミングコンテストに出場し、 $K$ 円の賞金を得ました！今、この賞金を分配しようとしています。

Segtree くんを含む $N$ 人のチームメンバーそれぞれには、実力順に $1$ から $N$ までの番号がつけられています。Segtree くんは $1$ 番です。

$i$ 番のチームメイト $(i \geq 2)$ の得る賞金額が「$i - 1$ 番のチームメイトの得た賞金額の半分を整数に切り捨てた値」より少ないと、その人は怒ってしまいます。

怒る人が一人もいないように $K$ 円の賞金を分配するとき、Segtree くんがもらえる賞金の最大値を求めてください。

入力

入力は以下の形式で標準入力から与えられる。

N K

出力

Segtree くんがもらえる賞金の最大値を出力してください。

ただし、最後には改行を入れること。

制約

$1 \leq N,K \leq 10^{18}$

入力は全て整数である。

入力例1

1 1

出力例1

1

入力例2

819875141880895728 349993004923078537

出力例2

174996502461539284

Solution in C# (judge verdict: Accepted)

using System;

public class hello
{
    public static void Main()
    {
        string[] line = Console.ReadLine().Trim().Split(' ');
        var n = long.Parse(line[0]);
        var k = long.Parse(line[1]);
        if (n == 1) { Console.WriteLine(k); goto exit; }
        if (k == 1) { Console.WriteLine(1); goto exit; }
        var ans = getAns(n, k);
        Console.WriteLine(ans);
    exit:;
    }
    static long getAns(long n, long k)
    {
        var ok = k / 2;
        var ng = k;
        while (ng - ok > 1)
        {
            var mid = (ok + ng) / 2;
            if (check(n, k, mid)) ok = mid;
            else ng = mid;
        }
        return ok;



    }
    static bool check(long n, long k, long targ)
    {
        var t = targ;
        var sum = t;
        var count = 1;
        while (true)
        {
            t /= 2;
            if (t == 0) return true;
            sum += t;
            if (sum > k) return false;
            count++;
            if (count == n) return true;
        }
    }
}