One Third,AGC032F,巧妙的构造

正题

      我们把这个圆分成平均分成三份,以第一刀为第一块与最后一块的边界。

      令它们的颜色为红蓝黄(左闭右开)。

      然后割下的每一刀的颜色就是所在位置的颜色,然后将每一刀都mod\frac{1}{3}

      现在就是找两个最近异色点对。

      可以自己讨论一下,发现很巧妙!

      通过简单积分可以得到:将一条长度为1的线段随机取n-1个点,分成n条线段,第k短线段的长度期望为\sum_{i=1}^k \frac{1}{n(n-i+1)}

      一切都看起来很随机,所以我们可以认为子线段两端的颜色也是随机的,最短的两端同色概率为\frac{1}{3},然后累加起来就好了。

     

#include
using namespace std;

int n;
const long long mod=1e9+7;
long long inv[1000010];

int main(){
	scanf("%d",&n);
	inv[1]=1;for(int i=2;i<=n;i++) inv[i]=inv[mod%i]*(mod-mod/i)%mod;
	long long ans=0,data=1,x=333333336;
	for(int i=1;i<=n;i++) (data*=x)%=mod,ans+=data*inv[n]%mod*inv[n-i+1]%mod;
	printf("%lld\n",ans%mod);
}

     

你可能感兴趣的:(One Third,AGC032F,巧妙的构造)