欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

CF1153F-Serval and Bonus Problem【dp,数学期望】

发布时间:2023/12/3 编程问答 52 豆豆
生活随笔 收集整理的这篇文章主要介绍了 CF1153F-Serval and Bonus Problem【dp,数学期望】 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

正题

题目链接:https://www.luogu.com.cn/problem/CF1153F


题目大意

在有nnn个区间的左右端点在[0,l)[0,l)[0,l)范围内随机,求被至少kkk个区间覆盖的期望长度。

1≤n,k≤2000,1≤l≤1091\leq n,k\leq 2000,1\leq l\leq 10^91n,k2000,1l109


解题思路

长度为lll上的数轴上2×n2\times n2×n个随机点的话期望距离都是l2n+1\frac{l}{2n+1}2n+1l

所以我们只需要考虑期望有多少个相邻点对之间被kkk个区间覆盖然后再乘上上面那个长度就行了。

然后考虑dpdpdp,设fi,jf_{i,j}fi,j表示现在到第iii个端点,前面有jjj个区间延伸过来,之后还剩n−j−i−j2n-j-\frac{i-j}{2}nj2ij个还没有出现的区间,jjj个还待结束的区间。

然后每次转移完加上不小于kkk个区间延伸到下一个的概率即可。

时间复杂度:O(nk)O(nk)O(nk)


code

#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll N=4100,P=998244353; ll n,k,l,ans,inv[N],f[N][N]; signed main() {scanf("%lld%lld%lld",&n,&k,&l);inv[1]=1;for(ll i=2;i<N;i++)inv[i]=P-inv[P%i]*(P/i)%P;f[0][0]=1;for(ll i=0;i<2*n;i++){for(ll j=0;j<=min(i,n);j++){if((i-j)&1)continue;ll w=n-j-(i-j)/2;if(j)(f[i+1][j-1]+=f[i][j]*j%P*inv[w*2+j]%P)%=P;(f[i+1][j+1]+=f[i][j]*w*2ll%P*inv[w*2+j]%P)%=P;}for(ll j=k;j<=min(i,n);j++)(ans+=f[i][j])%=P;}for(ll j=k;j<=n;j++)(ans+=f[2*n][j])%=P;printf("%lld\n",ans*l%P*inv[2*n+1]%P);return 0; }

总结

以上是生活随笔为你收集整理的CF1153F-Serval and Bonus Problem【dp,数学期望】的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。