hdu6574
正难则反,先算不相交
对于区间 [ l 1 , r 1 ] [l1,r1] [l1,r1]和 [ l 2 , r 2 ] [l2,r2] [l2,r2]
l 2 > r 1 或 者 r 2 < l 1 \color{Red}l2>r1或者r2<l1 l2>r1或者r2<l1
容易发现两种情况对称概率相同,所以只算 l 2 > r 1 l2>r1 l2>r1
n n n不大,可以枚举 r 1 r1 r1
所以 r 1 r1 r1有 n n n种取值,概率分别是 1 n \frac{1}{n} n1
假设 r 1 = 1 r1=1 r1=1,此时只要满足 l 2 > 1 l2>1 l2>1即可
那么当 r 2 = 1 r2=1 r2=1时满足 l 2 > 1 l2>1 l2>1的概率是 0 1 \frac{0}{1} 10
当 r 2 = 2 r2=2 r2=2时是 1 2 \frac{1}{2} 21
当 r 2 = 3 r2=3 r2=3时是 2 3 \frac{2}{3} 32
…
所以此时概率是 1 n ∗ 1 n ∗ ( 0 1 + 1 2 + 2 3 . . + n − 1 n ) \frac{1}{n}*\frac{1}{n}*(\frac{0}{1}+\frac{1}{2}+\frac{2}{3}..+\frac{n-1}{n}) n1∗n1∗(10+21+32..+nn−1)
当 r 1 = 2 r1=2 r1=2时概率是 1 n ∗ 1 n ∗ ( 0 1 + 0 2 + 1 3 . . + n − 2 n ) \frac{1}{n}*\frac{1}{n}*(\frac{0}{1}+\frac{0}{2}+\frac{1}{3}..+\frac{n-2}{n}) n1∗n1∗(10+20+31..+nn−2)
可以发现枚举 r 1 r1 r1后,变化的只是后面的系数,我们用 o n e one one来维护
处理 ∑ i = 2 i = n 1 i \sum\limits_{i=2}^{i=n} \frac{1}{i} i=2∑i=ni1前缀和可以 O ( 1 ) O(1) O(1)转移 o n e one one
#include <bits/stdc++.h> using namespace std; #define int long long const int maxn=2e6+10; const int mod=1e9+7; int pre[maxn],inv[maxn]; signed main() { int n; cin >> n; inv[1]=1; for(int i=2;i<=2000000;i++) inv[i]=(mod-mod/i)*inv[mod%i]%mod; int one=0,ans=0; for(int i=2;i<=n;i++) { one = (one+(i-1)*inv[i]%mod )%mod; pre[i]=( pre[i-1]+1*inv[i] )%mod; } for(int i=1;i<=n;i++)//l2>r1时 { ans = (ans+inv[n]*inv[n]%mod*one%mod)%mod; one = (one-(pre[n]-pre[i])+mod )%mod; } cout << ((1-ans*2)%mod+mod)%mod << '\n'; }