1897. 二分次数

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

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

记在这个过程中,进行比较 aca_cxx 的次数为 t(x)t(x)。则数组 aa 的平均搜索长度 ASLASL(average search length)为:1ni=1nt(ai)\dfrac 1n\sum_{i=1}^nt(a_i)

容易发现,ASLASL 仅与 nn 有关,与具体的 aa 取值无关。给定一个 n=2m+kn=2^m+k,求 ASLASL

输入

输入一行两个整数 m,k(0m109,0k<2m)m,k(0\le m\le10^9,0\le k < 2^m)

输出

输出一行一个整数,代表 nASLmod(109+7)nASL\bmod (10^9+7)

样例

标准输入 复制文本
3 2
标准输出 复制文本
29
标准输入 复制文本
0 0
标准输出 复制文本
1
标准输入 复制文本
114514 1919810
标准输出 复制文本
600463309

提示

对样例一,有 n=23+2=10n=2^3+2=10。不妨设 a=(1,2,3,4,5,6,7,8,9,10)a=(1,2,3,4,5,6,7,8,9,10),容易得到,t(a)=(3,2,3,4,1,3,4,2,3,4)t(a)=(3, 2, 3, 4, 1, 3, 4, 2, 3, 4),得 nASL=n1ni=1nt(ai)=29nASL=n\cdot\dfrac1n\sum_{i=1}^nt(a_i)=29

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