二分算法是一种非常有用的算法。它的最基本实现为:对一个长为 n 升序数组 a(这里设下标从 1 开始)要找到 x 元素所在的下标,初始搜索区间为 [1,n],不断执行以下步骤:
记在这个过程中,进行比较 a_c 与 x 的次数为 t(x)。则数组 a 的平均搜索长度 ASL(average search length)为:\dfrac 1n\sum_{i=1}^nt(a_i)。
容易发现,ASL 仅与 n 有关,与具体的 a 取值无关。给定一个 n=2^m+k,求 ASL。
输入
输入一行两个整数 m,k(0\le m\le10^9,0\le k < 2^m)。
输出
输出一行一个整数,代表 nASL\bmod (10^9+7)。
样例
标准输入 复制文本 |
3 2 |
标准输出 复制文本 |
29 |
标准输入 复制文本 |
0 0 |
标准输出 复制文本 |
1 |
标准输入 复制文本 |
114514 1919810 |
标准输出 复制文本 |
600463309 |
提示
对样例一,有 n=2^3+2=10。不妨设 a=(1,2,3,4,5,6,7,8,9,10),容易得到,t(a)=(3, 2, 3, 4, 1, 3, 4, 2, 3, 4),得 nASL=n\cdot\dfrac1n\sum_{i=1}^nt(a_i)=29。