题目链接:H - Rng
题意
给你一个长度为n的1~n区间,我们首先从[1,n]中任意选取一个整数r,然后再从[1,r]中任取一个整数l,构成一个区间 [ l 1 , r 1 ] {[l_1,r_1]} [l1,r1],相同的方法构造 [ l 2 , r 2 ] {[l_2,r_2]} [l2,r2]。问这两个区间相交的概率为多少,答案为 p q {\frac{p}{q}} qp的形式,输出 p ∗ q − 1 ( m o d ( 1 e 9 + 7 ) ) {p*q^{-1}(mod (1e9+7) )} p∗q−1(mod(1e9+7))。
题解
首先我们可以知道总共选取了哪些区间。
(1,1)
(1,2)(2,2)
(1,3)(2,3)(3,3)
(1,4)(2,4)(3,4)(4,4)
…
(1,n)(2,n)(3,n)(4,n)… (n,n)
这是第一次能构造的所有区间,第二次同理。
现在我们分析每个区间选取的概率。
由于先选取的是r,以r=2为例,选取r=2时的概率为 1 n {\frac{1}{n}} n1.
那么很容易得出选取区间(1,2)和(2,2)的概率都为 1 n ∗ 1 2 = 1 2 n {\frac{1}{n} * \frac{1}{2}=\frac{1}{2n}} n1∗21=2n1
同理分析其他区间的概率按照上边的下三角形列出一个概率表。
1 n {\frac{1}{n}} n1
1 2 n {\frac{1}{2n}} 2n1 1 2 n {\frac{1}{2n}} 2n1
1 3 n {\frac{1}{3n}} 3n1 1 3 n {\frac{1}{3n}} 3n1 1 3 n {\frac{1}{3n}} 3n1
…
1 n 2 {\frac{1}{n^2}} n21 1 n 2 {\frac{1}{n^2}} n21 1 n 2 {\frac{1}{n^2}} n21… 1 n 2 {\frac{1}{n^2}} n21
现在我们按照题意去寻找相交的区间概率相乘
ans = 1 n ∗ ( 1 n + 1 2 n + 1 3 n + . . . . + 1 n 2 ) {\frac{1}{n}*(\frac{1}{n}+\frac{1}{2n}+\frac{1}{3n}+....+\frac{1}{n^2})} n1∗(n1+2n1+3n1+....+n21)+
1 2 n ∗ ( 1 n + 2 ∗ 1 2 n + 2 ∗ 1 3 n + . . . + 2 ∗ 1 n 2 ) {\frac{1}{2n}*(\frac{1}{n}+2*\frac{1}{2n}+2*\frac{1}{3n}+...+2*\frac{1} {n^2})} 2n1∗(n1+2∗2n1+2∗3n1+...+2∗n21)+ 1 2 n ∗ ( 2 ∗ 1 2 n + 2 ∗ 1 3 n + . . . + 2 ∗ 1 n 2 ) {\frac{1}{2n}*(2*\frac{1}{2n}+2*\frac{1}{3n}+...+2*\frac{1} {n^2})} 2n1∗(2∗2n1+2∗3n1+...+2∗n21)+
1 3 n ∗ ( 1 n + 2 ∗ 1 2 n + 3 ∗ 1 3 n + . . . + 3 ∗ 1 n 2 ) {\frac{1}{3n}*(\frac{1}{n}+2*\frac{1}{2n}+3*\frac{1}{3n}+...+3*\frac{1} {n^2})} 3n1∗(n1+2∗2n1+3∗3n1+...+3∗n21)+ 1 3 n ∗ ( 2 ∗ 1 2 n + 3 ∗ 1 3 n + . . . + 3 ∗ 1 n 2 ) {\frac{1}{3n}*(2*\frac{1}{2n}+3*\frac{1}{3n}+...+3*\frac{1} {n^2})} 3n1∗(2∗2n1+3∗3n1+...+3∗n21)+ 1 3 n ∗ ( 3 ∗ 1 3 n + . . . + 3 ∗ 1 n 2 ) {\frac{1}{3n}*(3*\frac{1}{3n}+...+3*\frac{1} {n^2})} 3n1∗(3∗3n1+...+3∗n21)+…+
1 n 2 ∗ ( 1 n + 2 ∗ 1 2 n + 3 ∗ 1 3 n + . . . + n ∗ 1 n 2 ) {\frac{1}{n^2}*(\frac{1}{n}+2*\frac{1}{2n}+3*\frac{1}{3n}+...+n*\frac{1} {n^2})} n21∗(n1+2∗2n1+3∗3n1+...+n∗n21)+ 1 n 2 ∗ ( 2 ∗ 1 2 n + 3 ∗ 1 3 n + . . . + n ∗ 1 n 2 ) {\frac{1}{n^2}*(2*\frac{1}{2n}+3*\frac{1}{3n}+...+n*\frac{1} {n^2})} n21∗(2∗2n1+3∗3n1+...+n∗n21)+…+ 1 n 2 ∗ ( n ∗ 1 n 2 ) {\frac{1}{n^2}*(n*\frac{1} {n^2})} n21∗(n∗n21)
= 1 n ∗ ( 1 n + 1 2 n + 1 3 n + . . . . + 1 n 2 ) {\frac{1}{n}*(\frac{1}{n}+\frac{1}{2n}+\frac{1}{3n}+....+\frac{1}{n^2})} n1∗(n1+2n1+3n1+....+n21)+
1 2 n ∗ 2 ∗ ( 2 ∗ 1 2 n + 2 ∗ 1 3 n + . . . + 2 ∗ 1 n 2 ) {\frac{1}{2n}*2*(2*\frac{1}{2n}+2*\frac{1}{3n}+...+2*\frac{1} {n^2})} 2n1∗2∗(2∗2n1+2∗3n1+...+2∗n21)+ 1 2 n ∗ 1 n {\frac{1}{2n}*\frac{1}{n}} 2n1∗n1+
1 3 n ∗ 3 ∗ ( 3 ∗ 1 3 n + . . . + 3 ∗ 1 n 2 ) {\frac{1}{3n}*3*(3*\frac{1}{3n}+...+3*\frac{1} {n^2})} 3n1∗3∗(3∗3n1+...+3∗n21)+ 1 3 n ∗ ( 1 n + 2 ∗ 2 2 n ) {\frac{1}{3n}*(\frac{1}{n}+2*\frac{2}{2n})} 3n1∗(n1+2∗2n2)+…+
1 n 2 ∗ n ∗ ( n ∗ 1 n 2 ) {\frac{1}{n^2}*n*(n*\frac{1} {n^2})} n21∗n∗(n∗n21)+ 1 n 2 ∗ ( 1 n + 2 ∗ 2 2 n + 3 ∗ 3 3 n + . . . + ( n − 1 ) ∗ n − 1 ( n − 1 ) n ) {\frac{1}{n^2}*(\frac{1}{n}+2*\frac{2}{2n}+3*\frac{3}{3n}+...+(n-1)*\frac{n-1}{(n-1)n})} n21∗(n1+2∗2n2+3∗3n3+...+(n−1)∗(n−1)nn−1)
= 1 n ∗ ( 1 n + 1 + 2 2 n + 1 + 2 + 3 3 n + . . . . + 1 + 2 + . . . + n n 2 ) {\frac{1}{n}*(\frac{1}{n}+\frac{1+2}{2n}+\frac{1+2+3}{3n}+....+\frac{1+2+...+n}{n^2})} n1∗(n1+2n1+2+3n1+2+3+....+n21+2+...+n)+
1 2 n ∗ 1 n {\frac{1}{2n}*\frac{1}{n}} 2n1∗n1+ 1 3 n ∗ 1 + 2 n {\frac{1}{3n}*\frac{1+2}{n}} 3n1∗n1+2+ 1 4 n ∗ 1 + 2 + 3 n + . . . + 1 n 2 ∗ 1 + 2 + . . + ( n − 1 ) n {\frac{1}{4n}*\frac{1+2+3}{n}+...+\frac{1}{n^2}*\frac{1+2+..+(n-1)}{n}} 4n1∗n1+2+3+...+n21∗n1+2+..+(n−1)
= 1 n 2 + ( 1 + 2 ) + 1 2 n 2 + ( 1 + 2 + 3 ) + ( 1 + 2 ) 3 n 2 + . . . . + ( 1 + 2 + . . . + n ) + ( 1 + 2 + . . . + ( n − 1 ) ) n 3 {\frac{1}{n^2}+\frac{(1+2)+1}{2n^2}+\frac{(1+2+3)+(1+2)}{3n^2}+....+\frac{(1+2+...+n)+(1+2+...+(n-1))}{n^3}} n21+2n2(1+2)+1+3n2(1+2+3)+(1+2)+....+n3(1+2+...+n)+(1+2+...+(n−1))
= 1 n 2 + 2 n 2 + . . . . + n n 2 {\frac{1}{n^2}+\frac{2}{n^2}+....+\frac{n}{n^2}} n21+n22+....+n2n
= n + 1 2 n {\frac{n+1}{2n}} 2nn+1
千辛万苦就为了这一个式子。emmm…
剩下很简单了,用费马小定理求出逆元求解即可。
代码
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<bitset>
#include<cassert>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<deque>
#include<iomanip>
#include<list>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
using namespace std;
//extern "C"{void *__dso_handle=0;}
typedef long long ll;
typedef long double ld;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define pii pair<int,int>
#define lowbit(x) x&-x
const double PI=acos(-1.0);
const double eps=1e-6;
const ll mod=1e9+7;
const int inf=0x3f3f3f3f;
const int maxn=1e5+10;
const int maxm=100+10;
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
ll qpow(ll a,ll b)
{
ll ans=1;
while(b)
{
if(b&1) ans=ans*a%mod;
a=a*a%mod;
b>>=1;
}
return (ans+mod)%mod;
}
ll inv(ll a) {
return (qpow(a,mod-2)+mod)%mod; }
int main()
{
int n;
while(cin >> n)
{
ll ans=((1+n)*inv(2*n)%mod+mod)%mod;
cout << ans << endl;
}
}