qb#P10121. 星库索引

星库索引

题目背景

星港档案馆保存着许多星图目录。每份目录都是一个长度为 nn 的非降序编号表,编号范围在 11mm 之间。

档案馆的旧检索器使用固定的二分过程查询一个编号。你想知道:如果把所有可能的目录都拿来测试,并依次查询每个可能编号,检索器一共会进行多少次探测。

题目描述

给定一个非降数组 aa、一个整数 kk 和区间 [l,r][l,r],定义 f(a,k,l,r)f(a,k,l,r) 为下面过程的返回值:

function f(a, k, l, r):
    if a 中不包含 k:
        return 0
    mid = floor((l + r) / 2)
    if a[mid] == k:
        return 1
    else if a[mid] < k:
        return 1 + f(a, k, mid + 1, r)
    else:
        return 1 + f(a, k, l, mid - 1)

对于给定的 n,mn,m,称一个数组 aa 是合法的,当且仅当:

  • aa 的长度为 nn
  • 1a1a2anm1\le a_1\le a_2\le \dots\le a_n\le m

你需要对所有合法数组 aa,求

f(a,1,1,n)+f(a,2,1,n)++f(a,m,1,n)f(a,1,1,n)+f(a,2,1,n)+\dots+f(a,m,1,n)

的总和,并对 676767677676767677 取模。

输入格式

第一行包含一个整数 TT,表示测试用例数。

接下来 TT 行,每行包含两个整数 n,mn,m

输出格式

对每组测试数据,输出一行一个整数,表示答案对 676767677676767677 取模后的结果。

样例

输入

7
3 3
3 4
3 5
4 3
4 5
999967 99967
15 876543

输出

26
60
115
50
315
93903683
322710644

样例解释

在第一组测试数据中,一个合法数组是 [2,2,3][2,2,3]。此时:

  • f(a,1,1,n)=0f(a,1,1,n)=0,因为 11 不在数组中;
  • f(a,2,1,n)=1f(a,2,1,n)=1,第一次探测的位置就是一个 22
  • f(a,3,1,n)=2f(a,3,1,n)=2,先探测到 22,再向右探测到 33

因此这个数组的贡献为 0+1+2=30+1+2=3。对所有合法数组求和后得到 2626

数据范围

对于所有测试数据,满足:

  • 1T1041\le T\le 10^4
  • 3n,m1063\le n,m\le 10^6
  • 所有测试用例的 nn 之和不超过 10610^6
  • 所有测试用例的 mm 之和不超过 10610^6
  • 676767677676767677 是质数。

子任务

子任务 分数 特殊限制
1 10 T20, n,m7T\le 20,\ n,m\le 7
2 20 T20, n,m60T\le 20,\ n,m\le 60
3 25 所有测试用例的 nmn\cdot m 之和不超过 21072\cdot 10^7
4 45 无额外限制