题目描述
有 T 组询问,每次给定两个正整数 n,l,
你需要构造一个长度为 l 的正整数序列 a(编号从 1 至 l),
且满足 ∀i∈[1,l],都有 ai∈[1,n]。
求:
i=1∑lj=1∑i−1ai⊕aj
的最大值。
为了避免答案过大,对于每组询问,只需要输出这个最大值对 109+7 取模的结果。
输入格式
第一行一个整数 T,表示数据组数。
接下来第 2 行到第 T+1 行,每行两个整数 n,l ,分别代表 ai 的最大取值与 a 的长度。
输出格式
共 T 行,每行一个整数,对应每组询问的答案对 109+7 取模的结果。
1
2 3
6
2
114 514
1919 180
8388223
16580700
提示
【样例解释 #1】
当 n=2,l=3,a 取 {1,2,1} 的任一排列时可以得到最大值,为 (1⊕2)+(1⊕1)+(2⊕1)=6,易证明此时原式有最大值。
【数据规模与约定】
| 测试点编号 | T≤ | n≤ | l≤ |
| :----------: | :----------: | :----------: | :----------: |
| 1∼5 | 1 | 10 | 5 |
| 6 | 5×105 | 1012 | 2 |
| 7 | 5×105 | 1012 | 3 |
| 8∼10 | 5×105 | 1012 | 105 |
对于 100% 的数据,满足 1≤T≤5×105,1≤n≤1012,2≤l≤105。
【提示】
- 「⊕」是按位异或符号。如果您不知道什么是按位异或,可以参考这里。
- 取模是一种运算,a 对 b 取模代表将 a 赋值为 a 除以 b 所得到的余数。
在 C++ / Python 中的取模符号为 %
,在 Pascal 中的取模符号为 mod
。
- ∑ 是求和符号。如果您不知道什么是 ∑ 符号,可以参考这里。
- 请注意数据的读入输出对程序效率造成的影响。