@codeforces - 1153F@ Serval and Bonus Problem
@description@
从一条长度为 l 的线段中随机选择 n 条线段,共 2*n 个线段端点将这个线段分成 2*n + 1 个区间。
求这 2*n + 1 个区间中,被随机选择的 n 条线段中的至少 k 条覆盖的,区间的期望长度和。
对 998244353 取模。
Input
第一行三个整数 n, k 与 l (1≤k≤n≤2000, 1≤l≤10^9).
Output
输出一个整数,期望长度和对 998244353 取模的结果。
Examples
Input
1 1 1
Output
332748118
@solution@
首先有一个结论:如果随机将长度为 l 的线段划分成 k 个区间,则每个区间的期望长度为 l/k。(我也不会证)
这样连续期望就可以转为离散期望:
将 2*n 个点分配成 n 个线段,被至少 k 条线段覆盖的段的期望数量。
这样就可以做 dp 了:
定义 g[i][j] 表示前 i 个点已经分配完毕,其中还有 j 个左端点未匹配右端点,的方案数。
g[i][j] 的转移有两类:第 i 个点是左端点;第 i 个点是右端点,此时 j 个左端点都可以作为它的左端点,方案数乘 j。
定义 f[i][j] 表示前 i 个点已经分配完毕,其中还有 j 个左端点未匹配右端点,的被至少 k 条线段覆盖的总数量。
f[i][j] 的转移对应 g[i][j] 的转移也有两类,同时还要讨论 j >= k(i-1 ~ i 这一段是否被至少 k 条线段覆盖)与 j < k。
最后将 f[2n][0] 除以 g[2n][0],就得到了离散期望 E。
将 E 乘 l/(2*n + 1) 即可得到答案。
@accepted code@
#include<cstdio>
#include<iostream>
using namespace std;
const int MAXN = 4000;
const int MOD = 998244353;
int pow_mod(int b, int p) {
int ret = 1;
while( p ) {
if( p & 1 ) ret = 1LL*ret*b%MOD;
b = 1LL*b*b%MOD;
p >>= 1;
}
return ret;
}
int f[MAXN + 5][MAXN + 5], g[MAXN + 5][MAXN + 5];
int main() {
int n, k, l;
scanf("%d%d%d", &n, &k, &l);
l = 1LL*l*pow_mod(2*n + 1, MOD-2)%MOD;
g[0][0] = 1;
for(int i=1;i<=2*n;i++) {
for(int j=0;j<i;j++)
g[i][j+1] = (g[i][j+1] + g[i-1][j])%MOD;
for(int j=1;j<=i;j++)
g[i][j-1] = (g[i][j-1] + 1LL*j*g[i-1][j]%MOD)%MOD;
}
for(int i=1;i<=2*n;i++) {
for(int j=1;j<=i;j++)
f[i][j-1] = 1LL*j*((f[i-1][j] + 1LL*(j >= k)*g[i-1][j]%MOD)%MOD)%MOD;
for(int j=0;j<i;j++)
f[i][j+1] = ((f[i][j+1] + f[i-1][j])%MOD + 1LL*(j >= k)*g[i-1][j]%MOD)%MOD;
}
cout << 1LL*f[2*n][0]*l%MOD*pow_mod(g[2*n][0], MOD-2)%MOD << endl;
}
@details@
没什么重要的细节吧。。。
@codeforces - 1153F@ Serval and Bonus Problem的更多相关文章
- Codeforces 1153F Serval and Bonus Problem [积分,期望]
Codeforces 思路 去他的DP,暴力积分多好-- 首先发现\(l\)没有用,所以不管它. 然后考虑期望的线性性,可以知道答案就是 \[ \int_0^1 \left[ \sum_{i=k}^n ...
- CF1153F Serval and Bonus Problem
Serval and Bonus Problem 1.转化为l=1,最后乘上l 2.对于一个方案,就是随便选择一个点,选在合法区间内的概率 3.对于本质相同的所有方案考虑在一起,贡献就是合法区间个数/ ...
- CF1153F Serval and Bonus Problem FFT
CF1153F Serval and Bonus Problem 官方的解法是\(O(n ^ 2)\)的,这里给出一个\(O(n \log n)\)的做法. 首先对于长度为\(l\)的线段,显然它的答 ...
- Codeforces Round #551 (Div. 2) F. Serval and Bonus Problem (DP/FFT)
yyb大佬的博客 这线段期望好神啊... 还有O(nlogn)FFTO(nlogn)FFTO(nlogn)FFT的做法 Freopen大佬的博客 本蒟蒻只会O(n2)O(n^2)O(n2) CODE ...
- Codeforces1153F Serval and Bonus Problem 【组合数】
题目分析: 我们思考正好被k个区间覆盖的情况,那么当前这个子段是不是把所有的点分成了两个部分,那么在两个部分之间相互连k条线,再对于剩下的分别连线就很好了?这个东西不难用组合数写出来. 然后我们要证明 ...
- CF1153 F. Serval and Bonus Problem(dp)
题意 一个长为 \(l\) 的线段,每次等概率选择线段上两个点,共选出 \(n\) 条线段,求至少被 \(k\) 条线段覆盖的长度期望. 数据范围 \(1 \le k \le n \le 2000, ...
- CF1153F Serval and Bonus Problem 【期望】
题目链接:洛谷 作为一只沉迷数学多年的蒟蒻OIer,在推柿子和dp之间肯定要选推柿子的! 首先假设线段长度为1,最后答案乘上$l$即可. 对于$x$这个位置,被区间覆盖的概率是$2x(1-x)$(线段 ...
- 【codeforces 442B】 Andrey and Problem
http://codeforces.com/problemset/problem/442/B (题目链接) 题意 n个人,每个人有p[i]的概率出一道题.问如何选择其中s个人使得这些人正好只出1道题的 ...
- Codeforces Gym 100015A Another Rock-Paper-Scissors Problem 找规律
Another Rock-Paper-Scissors Problem 题目连接: http://codeforces.com/gym/100015/attachments Description S ...
随机推荐
- 安装node/npm,通过express搭建node项目
nodejs软件的下载地址:https://nodejs.org/en/ (推荐下载稳定版) 1.只要安装好了nodejs,就自动安装好了npm包. 2.在cmd中通过命令node -version查 ...
- C#调用C++ DLL动态库的两种方式
第一种方式:C++导出函数, c#dllimport 的方式 在很多地方都看到过,如[dllimport "user32.dll"]这种代码,调用windows API,就是通过这 ...
- FreeMarker 获取页面appplication、request、session
使用Request里的Attribute值最简单的方法就是直接${AttributeName}或者安全一点:${AttributeName!"default Value"} 1.取 ...
- java-文件切割合并_对象的序列化
一 文件的操作 1.1 概况 1,切割文件的原理:一个源对应多个目的:切割文件的两种方式. 2,碎片文件的命名和编号. 3,程序代码体现. 4,如何记录源文件的类型以及碎片的个数(建立配置信息文件)( ...
- Thinkphp5.0 模型hasOne、hasMany、belongsTo详解
ThinkPHP5有关联模型的操作,但有部分初学者对数据表中常见的几种表与表的关系还存在着问题,所以使用不好关联查询. 这里将hasOne.hasMany.belongsTo进行一个详细举例说明. 首 ...
- 洛谷P2327 [SCOI2005]扫雷 [2017年5月计划 清北学堂51精英班Day1]
P2327 [SCOI2005]扫雷 题目描述 输入输出格式 输入格式: 第一行为N,第二行有N个数,依次为第二列的格子中的数.(1<= N <= 10000) 输出格式: 一个数,即第一 ...
- JS中document对象和window对象的区别
简单来说,document是window的一个对象属性. Window 对象表示浏览器中打开的窗口. 如果文档包含框架(frame 或 iframe 标签),浏览器会为 HTML 文档创建一个 win ...
- HDU 4006优先队列
//按照降序排列,而且队列中只保存k个元素 #include<stdio.h> #include<queue> using namespace std; int main(){ ...
- pycharm多行批量缩进和反向缩进快捷键
在 VS, PYCHARM 中只要 拉选块之后,按下tab键,整个块就会缩进 按下 shift + tab 就会反向缩进
- 有意思的DP(CF360B Levko and Array)
刚才面试了一个蛮有意思的DP题目,脑子断片,没写出来,不过早上状态还是蛮好的 一个长度为n的序列最多改变k次,使相邻两数之差绝对值的最大值最小 三维的dp我先尝试写一下 Codeforces 360B ...