ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-10-15 09:00:26  阅读:217  来源: 互联网

标签:期望 Bonus ll Serval long leq CF1153F 区间 include


正题

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


题目大意

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

\(1\leq n,k\leq 2000,1\leq l\leq 10^9\)


解题思路

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

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

然后考虑\(dp\),设\(f_{i,j}\)表示现在到第\(i\)个端点,前面有\(j\)个区间延伸过来,之后还剩\(n-j-\frac{i-j}{2}\)个还没有出现的区间,\(j\)个还待结束的区间。

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

时间复杂度:\(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;
}

标签:期望,Bonus,ll,Serval,long,leq,CF1153F,区间,include
来源: https://www.cnblogs.com/QuantAsk/p/15409518.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有