7607: 序列期望

内存限制:128 MB 时间限制:5 S
题面:Markdown 评测方式:文本比较 上传者:
提交:1 通过:1

题目描述

给定一个长度为 $ n $ 的序列 $ x $。有 $ q $ 次询问,每次询问会给出两个整数 $ l,r $,你需要求出随机选择一个区间 $ [a,b] $ $ \left(l\leq a \leq b\leq r\right) $,区间 $ [a,b] $ 中不同的整数个数的数学期望。为了避免实数误差,你只需要求出答案在 $ 10^9+7 $ 模意义下的结果。 令 $ M=10^9+7 $ 。可以证明答案能够表示为最简分数 $ \frac{p}{q} $,其中 $ p $ 和 $ q $ 是正整数且 $ q \not \equiv 0 \pmod M $。则你需要输出 $ p \cdot q^{-1} \pmod M $,其中 $ q^{-1} $ 表示 $ q $ 在模 $ M $ 意义下的乘法逆元。换句话说,输出满足 $ 0 \leq x< M $ 且 $ x \cdot q \equiv p \pmod M $ 的整数 $ x $。可以证明,符合条件的 $ x $ 是唯一的。 --- 为了防止输入过大带来的常数问题,`C++` 选手请尽量使用关闭流同步的 `std::cin` 和 `std::cout` 实现输入输出,否则可能出现因读入输出问题导致的 TLE 等。 ```cpp int main(){ std::ios::sync_with_stdio(0); std::cin.tie(0); // your code return 0; } ```

输入格式

第一行一个整数 $ T $ $ \left(1 \leq T \leq 10^6\right) $,表示测试数据组数。 对于每组数据,第一行包含两个用空格分隔的整数 $ n,q $ $ \left(1\leq n, q\leq 2\cdot 10^5\right) $,分别表示序列长度和询问个数。 第二行包含 $ n $ 个用空格分隔的整数 $ x_1, x_2,\ldots , x_n $ $ \left(1\leq x_i\leq n\right) $。 接下来 $ q $ 行,每行包含两个用空格分隔的整数 $ l,r $ $ \left(1\leq l\leq r\leq n\right) $,表示一个询问。 保证所有测试数据的 $ n $ 之和与 $ q $ 之和均不超过 $ 10^6 $。

输出格式

对于每个询问输出一行一个整数,表示答案在 $ 10^9+7 $ 模意义下的结果。

输入样例 复制

2
5 5
3 5 3 2 2
1 5
2 5
4 5
3 4
2 4
5 5
1 1 1 1 1
1 5
2 5
3 4
4 5
1 3

输出样例 复制

66666669
900000008
1
333333337
666666673
1
1
1
1
1