【题解】CF1153F

题目描述

有一段长为l的线段,有n个区间,左右端点在[0,l)间均匀随机(可能不是整数)

求期望被至少k段区间覆盖的长度,对998244353取模。

题解

注意到每点是独立的,如果把每个点期望关于位置的函数写出来,那么我们要求的就是函数的积分
巨大恐怖的推式子,反正我是不会(luogu上好像有人是这么做的)
发现期望独立之后,假设区间长度为1,那么期望就是一点至少k覆盖的概率。
发现这个东西只和相对位置有关,于是就可以dp了...
妙妙题。

#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int rd(){
	int f=1,j=0;
	char w=getchar();
	while(!isdigit(w)){
		if(w=='-')f=-1;
		w=getchar();
	}
	while(isdigit(w)){
		j=j*10+w-'0';
		w=getchar();
	}
	return f*j;
}
const int N=4010,mod=998244353;
int f[N][N][2];
int n,k,l;
inline int pw(int x,int y){
	int ansn=1;
	while(y){
		if(y&1)ansn=ansn*x%mod;
		x=x*x%mod,y/=2;
	}
	return ansn;
}
signed main(){
	n=rd(),k=rd(),l=rd();
	f[0][0][0]=true;
	for(int i=1;i<=2*n+1;i++){
		for(int j=0;j<=i;j++){
			if(j>0)f[i][j][0]+=f[i-1][j-1][0],f[i][j][0]%=mod,f[i][j][1]+=f[i-1][j-1][1],f[i][j][1]%=mod;
			if(j>=k)f[i][j][1]+=f[i-1][j][0],f[i][j][1]%=mod;
			if(j<n)f[i][j][0]+=f[i-1][j+1][0]*(j+1)%mod,f[i][j][0]%=mod,f[i][j][1]+=f[i-1][j+1][1]*(j+1)%mod,f[i][j][1]%=mod;
		}
	}
//	for(int i=1;i<=2*n+1;i++){
//		for(int j=0;j<=i;j++)cout<<i<<" "<<j<<":"<<f[i][j][0]<<" "<<f[i][j][1]<<"\n";
//	}
	int ans=f[2*n+1][0][1];
//	cout<<"tim:"<<ans<<"\n";
	for(int i=1;i<=n;i++)ans=ans*2%mod;
	for(int i=1;i<=n;i++)ans=ans*i%mod;
	for(int i=1;i<=2*n+1;i++)ans=ans*pw(i,mod-2)%mod;
	printf("%lld\n",l*ans%mod);
	return 0;
}
posted @   flywatre  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示