@description@

给定一个序列 x = {x1, x2, ..., xn},已知 xi 是一个在 [li, ri] 内的随机整数。

令 B(x) 表示将序列 x 划分成若干连续的段,使每个段内所有数相同的最小划分数。

求 (B(x))^2 的期望 E((B(x))^2)。

Input

第一行包含一个整数 n (1≤n≤2⋅10^5))表示序列长度。

第二行包含 n 个整数 l1,l2,…,ln (1≤li≤10^9)。

第三行包含 n 个整数 r1,r2,...,rn (li≤ri≤10^9)。

Output

输出 E((B(x))^2) 对 10^9 + 7 的取模结果。

Examples

Input

3

1 1 1

1 2 3

Output

166666673

Input

3

3 4 5

4 5 6

Output

500000010

@solution@

平方期望看起来非常劝退,我们不妨从线性期望出发,考虑先计算 E(B(x))。

注意到 B(x) 可以通过计算 “使得 x[i] 与 x[i+1] 不同的 i 的个数” + 1 得到,于是我们考虑每一个 i 对 E(B(x)) 的贡献。

感性地认知一下,或许我们通过计算一对 (i, j) 对 E((B(x))^2) 的贡献?

考虑用期望的方法论证我们上面的想法。

令 \(I_i(x)\) 是一个随机变量,其中当 \(x[i] = x[i + 1]\) 时 \(l_i(x) = 0\),否则 \(l_i(x) = 1\)。

令 \(P_i(x)\) 表示 \(x[i]\not=x[i + 1]\) 的概率,则有 \(E(l_i(x)) = P_i(x)\)。

由于 \(B(x) = \sum_{i=1}^{n-1}I_i(x) + 1\),则 \(E(B(x)) = E(\sum_{i=1}^{n-1}l_i(x) + 1) = \sum_{i=1}^{n-1}E(l_i(x)) + 1\)。

上式可以通过期望的线性性质得到,于是恰好印证了我们一开始的感性推导。

接下来考虑 \(E(B(x)^2)\),可以得到如下式子:

\[E(B(x)^2) = E((\sum_{i=1}^{n-1}l_i(x) + 1)^2) = \sum_{i=1}^{n-1}E(l_i(x)^2) + 1 + 2*\sum_{i=1}^{n-1}(E(l_i(x))+\sum_{j=i+1}^{n-1}E(l_i(x)*l_j(x)))
\]

考虑 \(E(l_i(x)*l_j(x))\),其实就是 i 和 j 同时发生的概率,所以可以立即得到 \(E(l_i(x)^2) = E(l_i(x))\)。

又因为假如 \(|i - j| > 1\),即 i, j 不相邻时,它们之间的概率是不会互相影响的。

所以 \(E(l_i(x)*l_j(x)) = P_i(x)*P_j(x) = E(l_i(x))*E(l_j(x))\),当 \(|i - j| > 1\) 时。

我们不妨令 \(Q_i(x) = E(l_i(x)*l_{i+1}(x))\)。通过以上这些推导,我们可以把式子进一步化简:

\[E(B(x)^2) = 3*\sum_{i=1}^{n-1}P_i(x) + 1 + 2*\sum_{i=1}^{n-1}P_i(x)(\sum_{j=i+2}^{n-1}P_j(x)) + 2*\sum_{i=1}^{n-2}Q_i(x)
\]

现在考虑怎么求 P 和 Q。

首先是 \(P_i(x)\),即 i 和 i+1 不相同的概率。考虑容斥,即用 1 - 相同的概率。

相同的时候一定是从 i 的区间与 i+1 的区间的交中选择一个数,于是相同的概率 = 区间交的长度 / i 的区间长度 / i+1 的区间长度。

然后是 \(Q_i(x)\),一样考虑容斥,求 1 - (i 与 i + 1 相同的概率) - (i + 1 与 i + 2 相同的概率) + (i, i + 1 与 i + 2 相同的概率)。

三个相同的概率可以类比两两相同的概率得到,一样是求区间交。

@accepted code@

#include<cstdio>
#include<algorithm>
using namespace std;
const int MAXN = 200000;
const int MOD = int(1E9) + 7;
int pow_mod(int b, int p) {
int ret = 1;
while( p ) {
if( p & 1 ) ret = 1LL*ret*b%MOD;
b = 1LL*b*b%MOD;
p >>= 1;
}
return ret;
}
int P[MAXN + 5], S[MAXN + 5];
int l[MAXN + 5], r[MAXN + 5], n;
int main() {
scanf("%d", &n);
for(int i=1;i<=n;i++) scanf("%d", &l[i]);
for(int i=1;i<=n;i++) scanf("%d", &r[i]);
for(int i=1;i<n;i++) {
int len = max(0, min(r[i], r[i + 1]) - max(l[i], l[i + 1]) + 1);
int tmp = 1LL*pow_mod(r[i] - l[i] + 1, MOD - 2)*pow_mod(r[i + 1] - l[i + 1] + 1, MOD - 2)%MOD;
P[i] = (1 + MOD - 1LL*tmp*len%MOD)%MOD;
}
for(int i=1;i<n;i++) S[i] = (P[i] + S[i-1])%MOD;
int ans = (3LL*S[n - 1]%MOD + 1)%MOD;
for(int i=1;i+2<n;i++)
ans = (ans + 2LL*(S[n - 1] + MOD - S[i + 1])%MOD*P[i]%MOD)%MOD;
for(int i=1;i+1<n;i++) {
int len = max(0, min(r[i], min(r[i + 1], r[i + 2])) - max(l[i], max(l[i + 1], l[i + 2])) + 1);
int tmp = 1LL*pow_mod(r[i] - l[i] + 1, MOD - 2)%MOD*pow_mod(r[i + 1] - l[i + 1] + 1, MOD - 2)%MOD*pow_mod(r[i + 2] - l[i + 2] + 1, MOD - 2)%MOD;
int del = 1;
del = ((del + P[i])%MOD + MOD - 1)%MOD;
del = ((del + P[i + 1])%MOD + MOD - 1)%MOD;
del = (del + 1LL*tmp*len%MOD)%MOD;
ans = (ans + 2LL*del%MOD)%MOD;
}
printf("%d\n", ans);
}

@details@

其实有一个简化公式的方法,即令 \(l_n(x) = 1\),将上面 1 全部替换成 \(l_n(x)\)。

其他应该就没什么了。代码也比较好写。

@codeforces - 1187F@ Expected Square Beauty的更多相关文章

  1. Codeforces 1187 F - Expected Square Beauty

    F - Expected Square Beauty 思路:https://codeforces.com/blog/entry/68111 代码: #pragma GCC optimize(2) #p ...

  2. CF1187F Expected Square Beauty(期望)

    题目 CF1187F Expected Square Beauty 做法 \(B(x)=\sum\limits_{i=1}^n I_i(x),I_i(x)=\begin{cases}1&x_i ...

  3. Codeforces 828B Black Square(简单题)

    Codeforces 828B Black Square(简单题) Description Polycarp has a checkered sheet of paper of size n × m. ...

  4. CodeForces 1A Theatre Square

    A - Theatre Square Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u ...

  5. CodeForces 710CMagic Odd Square(经典-奇数个奇数&偶数个偶数)

    题目链接:http://codeforces.com/problemset/problem/710/C 题目大意:输入一个奇数n,则生成n*n矩阵,要求矩阵的行.列还有斜着,所有元素之和为奇数. 解题 ...

  6. Codeforces 112B-Petya and Square(实现)

    B. Petya and Square time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  7. Codeforces 840D Expected diameter of a tree 分块思想

    Expected diameter of a tree 我们先两次dfs计算出每个点能到达最远点的距离. 暴力计算两棵树x, y连边直径的期望很好求, 我们假设SZ(x) < SZ(y) 我们枚 ...

  8. Codeforces 804D Expected diameter of a tree

    D. Expected diameter of a tree time limit per test 3 seconds memory limit per test 256 megabytes inp ...

  9. Codeforces 895.C Square Subsets

    C. Square Subsets time limit per test 4 seconds memory limit per test 256 megabytes input standard i ...

随机推荐

  1. mysql查询某个字段并修改

    比如我存储的数据,有的是 山东,有的是山东省 我想统一改为山东省 UPDATE t_security SET province = REPLACE( province, '山东', '山东省' ) W ...

  2. LinqToExcel 简洁与优美开源库

    转载:https://www.cnblogs.com/codefish/archive/2013/04/08/3009098.html 正在做项目,同事问道有啥简单的方法读取excel到DataTab ...

  3. phpBOM头(字符&#65279;)出现的原因以及解决方法_PHP程序员博客|高蒙个人博客

    今天在项目中发现,客户端在使用ajax得到返回值时,无法匹配字符串.总是报错,打开页面接口发现,页面的头部出现了的字符(BOM头),找到问题了,那么直接用代码清除掉即可. php隐形字符 // 如 ...

  4. LUOGU 1278 单词游戏

    题目描述 Io和Ao在玩一个单词游戏. 他们轮流说出一个仅包含元音字母的单词,并且后一个单词的第一个字母必须与前一个单词的最后一个字母一致. 游戏可以从任何一个单词开始. 任何单词禁止说两遍,游戏中只 ...

  5. jquery源码学习(一)——jquery结构概述以及如何合适的暴露全局变量

    jQuery 源码学习是对js的能力提升很有帮助的一个方法,废话不说,我们来开始学习啦 我们学习的源码是jquery-2.0.3已经不支持IE6,7,8了,因为可以少学很多hack和兼容的方法. jq ...

  6. opencv 图像基本操作

    目录:读取图像,获取属性信息,图像ROI,图像通道的拆分和合并 1.  读取图像 像素值返回:直接使用坐标即可获得, 修改像素值:直接通过坐标进行赋值 能用矩阵操作,便用,使用numpy中的array ...

  7. LintCode刷题笔记-- BackpackIV

    标签: 动态规划 描述: Given an integer array nums with all positive numbers and no duplicates, find the numbe ...

  8. python输出最大公约数和最小公倍数

    def myfun(): num1 = int(input('输入num1')) num2 = int(input('输入num2')) list1=[] for i in range(1, max( ...

  9. Openck_Swift源代码分析——添加、删除设备时算法详细的实现过程

    1 初始加入设备后.上传Object的详细流程  前几篇博客中,我们讲到环的基本原理即详细的实现过程,加入我们在初始创建Ring是执行例如以下几条命令: •swift-ring-builder obj ...

  10. 廖雪峰Python总结2

    1.切片 L[0:3]表示,从索引0开始,直到索引3为止,但是不包括索引3.如果第一个索引是0,还可以省略L[:3] 倒数切片:L[-n:-1],-1是倒数第一个元素,L[-n:-1]不包括倒数第一个 ...