[2019CCPC-江西省赛] H - Rng 概率+数学推导

题目链接: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) )} pq1(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}} n121=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+22n1+23n1+...+2n21)+ 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(22n1+23n1+...+2n21)+

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+22n1+33n1+...+3n21)+ 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(22n1+33n1+...+3n21)+ 1 3 n ∗ ( 3 ∗ 1 3 n + . . . + 3 ∗ 1 n 2 ) {\frac{1}{3n}*(3*\frac{1}{3n}+...+3*\frac{1} {n^2})} 3n1(33n1+...+3n21)+…+

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+22n1+33n1+...+nn21)+ 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(22n1+33n1+...+nn21)+…+ 1 n 2 ∗ ( n ∗ 1 n 2 ) {\frac{1}{n^2}*(n*\frac{1} {n^2})} n21(nn21)

= 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})} 2n12(22n1+23n1+...+2n21)+ 1 2 n ∗ 1 n {\frac{1}{2n}*\frac{1}{n}} 2n1n1+

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})} 3n13(33n1+...+3n21)+ 1 3 n ∗ ( 1 n + 2 ∗ 2 2 n ) {\frac{1}{3n}*(\frac{1}{n}+2*\frac{2}{2n})} 3n1(n1+22n2)+…+

1 n 2 ∗ n ∗ ( n ∗ 1 n 2 ) {\frac{1}{n^2}*n*(n*\frac{1} {n^2})} n21n(nn21)+ 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+22n2+33n3+...+(n1)(n1)nn1)

= 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}} 2n1n1+ 1 3 n ∗ 1 + 2 n {\frac{1}{3n}*\frac{1+2}{n}} 3n1n1+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}} 4n1n1+2+3+...+n21n1+2+..+(n1)

= 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+...+(n1))

= 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;
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_44235989/article/details/108223515