题解:
首先第一步转化,每一刀顺时针120度逆时针120度再切一刀。
落在以第一刀为
0度,
[0,3π)里面染成红色,落在
[3π,32π)为绿色,落在
[32π,π)染成蓝色。
把所有刀模
3π扔到第一个区间,现在相当于一条长
31的线段
0处为红色,
31为蓝色,中间还有
n−1个点,位置和颜色均匀随机,所有相邻点把线段分成了一共
n段,询问最短的两端颜色不同的线段长度的期望。
把所有线段拿出来排序,考虑答案为第
i短的线段,意味着前
i−1的线段两端颜色相同,概率为
3i−11⋅32。
现在问题就只剩下,第
k短的线段的期望长度是多少。
这个好像是一个经典问题,和随机的第
k大有点类似但完全不同。
现在考虑初始线段长度为
1的情况
首先考虑最短的线段
Lmin。
我们希望计算
E(Lmin),一个通用做法是计算
P(Lmin≥x)也就是概率分布函数,然后对
P积分。
考虑计算
P(Lmin≥x),最短的为
x,那么我们每段预留出
x,直接把
nx切掉扔了,剩下
n段
n−1个分隔符必须留在
1−nx里面,则:
P(Lmin≥x)=(1−nx)n−1
积分得到:
E(Lmin)=∫0n1P(Lmin≥x)dx=∫0n1(1−nx)n−1dx=n1∫01xn−1dx=n21
考虑次小值,把最小值丢掉之后,次小值就是剩下线段的最小值,再把最小值接回去:
E(Lsubmin)=(n−1)21−E(Lmin)+E(Lmin)=n1(n1+n−11)
同理
k小值的表达式为
E(Lkthmin)=n1i=0∑k−1n−i1
则答案就是
i=1∑n3i2E(Lith min)。
化简一下就是
i=1∑n3in(n−i+1)1
代码:
#include<bits/stdc++.h>
#define ll long long
#define re register
#define cs const
cs int mod=1e9+7;
inline int add(int a,int b){a+=b-mod;return a+(a>>31&mod);}
inline int mul(int a,int b){ll r=(ll)a*b;return r>=mod?r%mod:r;}
cs int N=1e6+7;
int inv[N],inv3=(mod+1)/3;
int n,ans;
signed main(){
scanf("%d",&n);inv[0]=inv[1]=1;
for(int re i=2;i<=n;++i)inv[i]=mul(mod-mod/i,inv[mod%i]);
int coef=inv[n];
for(int re i=0;i<n;++i){
coef=mul(coef,inv3);
ans=add(ans,mul(coef,inv[n-i]));
}
std::cout<<ans<<"\n";
return 0;
}
转载:
https://blog.csdn.net/zxyoi_dreamer/article/details/102054689