CF1523E Crypto Lights

CF1523E\(\mathbf{} \begin{Bmatrix} \frac{{\Large CF1523E} }{{\color{Red}\Large Solution} }\mathbf{} {No.30} \end{Bmatrix}\times{}\) NeeDna

题目描述

\(n\) 个台灯初始时都是暗的,每次等概率随机一个暗台灯将其点亮,若点亮后存在一个长度为 \(k\) 的连续段有大于一个台灯被点亮则立刻停止,求期望点亮多少台灯。答案对 \(10^9+7\) 取模。

题解

这道题是期望 dp,这个是简单就可以看出来的,那我们来构造期望的算法。

一般的,我们把期望拆成概率乘以贡献。定义 \(p_i\) 为点亮 \(i\) 颗灯结束操作的概率,所以我们可以得到这个式子:

\[E = \sum_{i=1}^{n} i\times p_i \]

拆出来一点用也没有,为什么,我们能算出来的其实是到第 \(i\) 步也成功的概率,设它为 \(s_i\),但是这个和 \(p_i\) 差的距离有点远,我们看看 \(s_i\) 等于什么:其实就是在 \([i+1,n]\) 步失败的概率和。即令 \(s_i = \sum_{j=i}^n p_i\)。那么有:

\[E = \sum_{i=1}^n s_{i-1} \]

这下就能算了,我们可以采用插板法,对于求\(s_{i-1}\),有 $ i-1 $ 盏亮着的灯,显然一共有 \(\dbinom{n}{i-1}\) 种选法。那么合法的情况呢,考虑一下限制,每个亮灯至少隔 \(k-1\) 个灭着的灯,而其中有 \(i-2\) 个间隔,所以我们发现每一种合法的答案其实有 \((k-1)\times (i-2)\) 个灭着的灯是固定的,剩下随便选的点就只剩 \(n-(k-1)\times(i-2)\) 个了,所以合法的答案共有 \(\dbinom{n-(k-1)\times(i-2)}{i-1}\),得到:

\[s_{i-1} = \dfrac{\dbinom{n-(k-1)\times(i-2)}{i-1}}{\dbinom{n}{i-1}} \]

计算即可。注意特判 \(i=1\) 的时候 \(s_{i-1}\)\(1\)
code:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10,mod=1e9+7;
int T,n,k,ni[N],jie[N],ans;
int ksm(int x,int k){
	int ans=1;
	while(k>1){
		if(k%2==1) ans=ans*x%mod;
		x=x*x%mod;k/=2;
	}return (ans*x)%mod;
}
int c(int n,int m){
	if(n>m) return 0;
	return (jie[m]*ni[n]%mod)*ni[m-n]%mod;
}
signed main(){
	cin>>T;ni[0]=jie[1]=1;
	for(int i=2;i<N;i++){
		jie[i]=jie[i-1]*i%mod;
	}ni[N-1]=ksm(jie[N-1],mod-2);
	for(int i=N-2;i>=1;i--){ni[i]=ni[i+1]*(i+1)%mod;} 
	while(T--){
		cin>>n>>k;ans=1;
		for(int i=2;i<=n;i++){
			ans=(ans+c(i-1,n-(k-1)*(i-2))*ksm(c(i-1,n),mod-2)%mod)%mod;
		}cout<<ans<<'\n';
	}
	return 0;
}
posted @ 2025-07-25 11:46  NeeDna  阅读(25)  评论(0)    收藏  举报