题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6574
题意:区间内选两个线段,求两个线段不相交的概率。
思路:线段相交有两种情况,第一种第二个线段的右端点
在第一个线段内,这种情况我们只需要
在区间
之间即可,不需要管
的位置,我们在区间
找一点
作为
的概率是
,然后在
的左边找一点
作为
概率是
,
在
之间的概率就是
,第一种情况概率就是
,化简一下
。
第二种情况,此时要满足
,同样我们在区间
找一点
作为
的概率是
,我们在
右边找一点
作为
概率也是
,为什么呢?设事件
在区间
选择区间
,那么
,设事件
在区间
选一点,那么
,那么在事件
的前提下事件
发生的概率为
,
。
可以从区间
,但是要满足
,所以只能从
选概率为
,第二种情况概率就是
,化简一下
第二层可以用逆元前缀和优化。时间复杂度
。
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 4e6 + 7;
const int MOD = 1e9 + 7;
ll inv[N], sum[N];
int main()
{
inv[1] = 1; sum[1] = 1;
for(int i = 2; i <= N; i++)
{
inv[i] = (MOD - MOD / i) * inv[MOD % i] % MOD;
sum[i] = sum[i-1] + inv[i];
}
int n; scanf("%d",&n);
ll ans = 0;
for(int i = 1; i <= n; i++)
{
ll temp = i * inv[n] % MOD * inv[n] % MOD;
temp = (temp * (sum[n] - sum[i] + MOD) % MOD) % MOD;
ans = (ans + temp) % MOD;
}
ans = (ans + (n + 3) * inv[4*n] % MOD) % MOD;
cout << ans << endl;
}