【题解】CF1153F
题目描述
有一段长为的线段,有个区间,左右端点在间均匀随机(可能不是整数)
求期望被至少段区间覆盖的长度,对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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通