2023.2.13 日寄

2023.2.13日寄

一言

\(~~~~\) 这些围墙很有趣,刚开始你恨他,慢慢地你适应它,最后,你离不开他。——《肖申克的救赎》

模拟赛

Click Here


晚间练习

嘉然今天吃什么

题意

\(~~~~\) 长为 \(n\) 初始关闭的灯,每次操作选择一个灯开启,当所有连续长 \(k\) 的段都至少有一个灯开启时停止操作,求期望开灯次数。
\(~~~~\) \(1\leq n,k\leq 10^7\).

题解

\(~~~~\) 考虑算概率:记 \(p_i\) 为放了 \(i\) 个灯,还不满足停止条件的概率,那么答案为 \(\sum_{i=0}^n p_i\)

\(~~~~\) 然后 \(p_i\) 可以用容斥算:\(p_i=\sum_{j} (-1)^{j-1}\frac{\binom{n-jk}{i}\binom{i+1}{j}}{\binom{n}{i}}\).其中 \(j\) 枚举的是有多少个空段不合法。

\(~~~~\) 开始推式子:

\[Ans=\sum_{i=1}^n \sum_{j} (-1)^{j-1}\frac{\binom{n-jk}{i}\binom{i+1}{j}}{\binom{n}{i}}\\=\sum_{i=1}^n \sum_{j}(-1)^{j-1}\frac{\binom{n-jk}{i}}{\binom{n}{i}}\times \binom{i+1}{j}\\= \sum_{j}(-1)^{j-1}\sum_{i=1}^n\frac{(n-jk)!}{i!(n-jk-i)!}\times \frac{i!(n-i)!}{n!}\times \binom{i+1}{j} \]

\(~~~~\) 两个拆出来的阶乘上下同时乘一个 \((jk)!\):

\[Ans=\sum_{j}(-1)^{j-1}\sum_{i=1}^n\frac{(n-jk)!(jk)!}{n!}\sum_{i=1}^n \binom{n-i}{jk}\binom{i+1}{j} \]

\(~~~~\) 后面 \(\sum_i\) 的部分组合意义分析等于 \(\binom{n+i+2}{jk+j+1}\) ,上下都加的 \(1\) 是钦定一个东西作为分界线。

代码
查看代码
#include <bits/stdc++.h>
#define PII pair<int,int>
#define mp(a,b) make_pair(a,b)
using namespace std;
template<typename T>void read(T &x)
{
    T f=1;x=0;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}
    x*=f;
}
int Fac[10000005],Inv[10000005];
const int MOD=998244353;
inline int Add(int a,int b){a+=b;return a>=MOD?a-MOD:a;}
inline int Dec(int a,int b){a-=b;return a<0?a+MOD:a;}
inline int Mul(int a,int b){return 1ll*a*b%MOD;}
int qpow(int a,int b)
{
	int ret=1;
	while(b)
	{
		if(b&1) ret=Mul(ret,a);
		b>>=1;a=Mul(a,a);
	}
	return ret;
}
inline int C(int n,int r){return r<=n?Mul(Fac[n],Mul(Inv[n-r],Inv[r])):0;}
int main() {
	int n,k;read(n);read(k);
	if(k==1) return printf("%d",n)&0;
	Fac[0]=1;
	for(int i=1;i<=10000000;i++) Fac[i]=Mul(Fac[i-1],i);
	Inv[10000000]=qpow(Fac[10000000],MOD-2);
	for(int i=10000000-1;i>=1;i--) Inv[i]=Mul(Inv[i+1],i+1);
	int Ans=0;
	for(int j=1;j<=n/k;j++)
		Ans=Add(Ans,Mul(((j-1)%2==0)?1:MOD-1,Mul(Fac[n-j*k],Mul(Fac[j*k],C(n+2,j*k+j+1)))));	
	printf("%d",Mul(Ans,Inv[n]));
	return 0;
}
/*
瑶草一何碧,春入武陵溪。溪上桃花无数,花上有黄鹂。我欲穿花寻路,直入白云深处,浩气展虹霓。只恐花深里,红露湿人衣。
坐玉石,欹玉枕。拂金徽。谪仙何处,无人伴我白螺杯。我为灵芝仙草,不为朱唇丹脸,长啸亦何为。醉舞下山去,明月逐人归。
*/

posted @ 2023-02-13 21:51  Azazеl  阅读(30)  评论(0编辑  收藏  举报