1897. 二分次数

二分算法是一种非常有用的算法。它的最基本实现为:对一个长为 n 升序数组 a(这里设下标从 1 开始)要找到 x 元素所在的下标,初始搜索区间为 [1,n],不断执行以下步骤:

  1. 记当前搜索区间为 [l,r],设中点为 c=\lfloor\dfrac{l+r}2\rfloor
  2. 比较 a_cx。若 a_c=x,则找到下标 c 为答案;否则若 a_c < x,设新区间为 [l,c-1],若 a_c > x,设新区间为 [c+1,r]。如果新区间非空(即左端点不大于右端点),则对新区间继续执行步骤 1,否则输出无解。

记在这个过程中,进行比较 a_cx 的次数为 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

登录以提交代码。
单点时限 1 秒
内存限制 128 MB
提交 12
通过 7