星库索引
该比赛已结束,您无法在比赛模式下递交该题目。您可以点击“在题库中打开”以普通模式查看和递交本题。
题目背景
星港档案馆保存着许多星图目录。每份目录都是一个长度为 的非降序编号表,编号范围在 到 之间。
档案馆的旧检索器使用固定的二分过程查询一个编号。你想知道:如果把所有可能的目录都拿来测试,并依次查询每个可能编号,检索器一共会进行多少次探测。
题目描述
给定一个非降数组 、一个整数 和区间 ,定义 为下面过程的返回值:
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)
对于给定的 ,称一个数组 是合法的,当且仅当:
- 的长度为 ;
- 。
你需要对所有合法数组 ,求
的总和,并对 取模。
输入格式
第一行包含一个整数 ,表示测试用例数。
接下来 行,每行包含两个整数 。
输出格式
对每组测试数据,输出一行一个整数,表示答案对 取模后的结果。
样例
输入
7
3 3
3 4
3 5
4 3
4 5
999967 99967
15 876543
输出
26
60
115
50
315
93903683
322710644
样例解释
在第一组测试数据中,一个合法数组是 。此时:
- ,因为 不在数组中;
- ,第一次探测的位置就是一个 ;
- ,先探测到 ,再向右探测到 。
因此这个数组的贡献为 。对所有合法数组求和后得到 。
数据范围
对于所有测试数据,满足:
- ;
- ;
- 所有测试用例的 之和不超过 ;
- 所有测试用例的 之和不超过 ;
- 是质数。
子任务
| 子任务 | 分数 | 特殊限制 |
|---|---|---|
| 1 | 10 | |
| 2 | 20 | |
| 3 | 25 | 所有测试用例的 之和不超过 |
| 4 | 45 | 无额外限制 |