CF1153F Serval and Bonus Problem

官方的解法是\(O(n ^ 2)\)的,这里给出一个\(O(n \log n)\)的做法。

首先对于长度为\(l\)的线段,显然它的答案就是长度为\(1\)的线段的答案\(\times l\),这样做只是为了方便计算。

考虑对于数轴上区间\([0,1]\)内任意一个点\(x\),它被一条随机线段覆盖的概率是多少:线段的两个端点都在它左边的概率是\(x ^ 2\)、都在它右边的概率是\((1 - x) ^ 2\),那么它被覆盖的概率即为\(p(x) = 1 - x^2 - (1 - x) ^ 2 = 2 x (1 - x)\)。

那么他被\(\ge k\)条线段覆盖的概率为\(f(x) = \sum \limits _{i = k} ^ n \binom{n}{i} p(x) ^ i (1 - p(x)) ^ {n - i}\)。

根据定积分的定义就得到区间\([0,1]\)内被\(\ge k\)条线段覆盖的长度期望为\(\int _{0} ^{1} f(x) \mathrm{d} x\)。

现在我们的问题就是怎么算这个东西了:

\[\begin{align*} \int _ 0 ^ 1 f(x) \mathrm{d} x & = \int _ 0 ^ 1 \sum \limits _{i = k} ^ n \binom {n} {i} (2x (1 - x)) ^ i (1 - 2x (1 - x)) ^ {n - i} \mathrm{d} x \\ & = \sum \limits _{i = k} ^ n \binom {n} {i} \int _ 0 ^ 1 (2x (1 - x)) ^ i \sum \limits _{j = 0} ^ {n - i} \binom {n - i} {j} (-2x(1 - x)) ^ j \mathrm{d} x \\ & = \sum \limits _{i = k} ^n \binom {n} {i} \sum \limits _{j = 0} ^ {n - i} \binom {n - i} {j} (-1) ^ j 2 ^ {(i + j)} \int _ 0 ^ 1 x ^ {i + j} (1 - x) ^ {i + j} \mathrm{d} x \end{align*}
\]

推到这里,就可以把积分去掉了,这是一个Beta Function的形式:记结论吧

\[B(x, y) = \int _ 0 ^ 1 t ^ {x - 1} (1 - t) ^ {y - 1} \mathrm{d} t = \frac {(x - 1) ! (y - 1) !} {(x + y - 1) !}
\]

代入得:

\[\begin{align*} \int _ 0 ^ 1 f(x) \mathrm{d} x & = \sum \limits _{i = k} ^n \binom {n} {i} \sum \limits _{j = 0} ^ {n - i} \binom {n - i} {j} (-1) ^ j 2 ^ {(i + j)} \frac {((i + j) ! ) ^ 2} {(2(i + j) + 1) !} \\ & = n ! \sum \limits _{i = k} ^ n \sum \limits _ {j = 0} ^ {n - i} \frac {1} {i !} \frac {(-1) ^ j} {j !} \frac {2 ^ {i + j} ((i + j) !) ^ 2} {(2(i+ j) + 1) ! (n - (i + j)) !} \end{align*}
\]

令\(t = i + j\),\(f[i] = \frac {1} {i}\),\(g[j] = \frac {(-1) ^ j} {j !}\),\(h[t] = \frac{2^t (t !) ^ 2} {(2 t + 1) ! (n - t) !}\),考虑枚举\(t\):

\[\begin{align*} \int _ 0 ^ 1 f(x) \mathrm{d} x & = n ! \sum \limits _{t = k} ^ n h[t] \sum \limits _ {i = k} ^ t f[i] g[t - i] \end{align*}
\]

这后面就是一个非常显然的卷积式子了,直接FFT即可。

答案记得\(\times l\)。

//written by newbiechd
#include <cstdio>
#include <cctype>
#include <algorithm>
#define BUF 1000000
using namespace std;
const int N = 100003, yyb = 998244353, Gg = 3, Gi = 332748118;
char buf[BUF], *p1, *p2;
inline char gc() { return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, BUF, stdin), p1 == p2) ? EOF : *p1++; }
inline int rd() {
register int f = 0;
register char c;
while (!isdigit(c = gc())) {}
do
f = f * 10 + (c ^ 48);
while (isdigit(c = gc()));
return f;
}
int rev[N], G[2][N];
inline int power(int x, int y) {
register int o = 1;
for (; y; y >>= 1, x = 1ll * x * x % yyb)
if (y & 1)
o = 1ll * o * x % yyb;
return o;
}
inline void ntt(int *f, int len, int opt) {
register int i, j, k, x, y, p, q;
for (i = 1; i < len; ++i)
if (i < rev[i])
swap(f[i], f[rev[i]]);
for (i = 1; i < len; i <<= 1) {
p = G[opt][i];
for (j = 0; j < len; j += i << 1)
for (k = 0, q = 1; k < i; ++k, q = 1ll * p * q % yyb)
x = f[j | k], y = 1ll * q * f[i | j | k] % yyb, f[j | k] = (x + y) % yyb, f[i | j | k] = (x - y) % yyb;
}
}
int fac[N], invFac[N], f[N], g[N], h[N];
int main() {
#ifndef ONLINE_JUDGE
freopen("a.in", "r", stdin);
freopen("a.out", "w", stdout);
#endif
int n = rd(), m = n << 1 | 1, k = rd(), l = rd(), i, len, tmp, ans = 0;
fac[0] = 1;
for (i = 1; i <= m; ++i)
fac[i] = 1ll * fac[i - 1] * i % yyb;
invFac[m] = power(fac[m], yyb - 2);
for (i = m; i; --i)
invFac[i - 1] = 1ll * invFac[i] * i % yyb;
for (i = k; i <= n; ++i)
f[i] = invFac[i];
for (i = 0; i <= n; ++i)
g[i] = i & 1 ? yyb - invFac[i] : invFac[i];
for (len = 1; len <= m; len <<= 1) {}
for (i = 1; i < len; ++i)
rev[i] = (rev[i >> 1] >> 1) | (i & 1 ? len >> 1 : 0);
for (i = 1; i < len; i <<= 1)
G[0][i] = power(Gg, (yyb - 1) / (i << 1)), G[1][i] = power(Gi, (yyb - 1) / (i << 1));
ntt(f, len, 0), ntt(g, len, 0);
for (i = 0; i < len; ++i)
f[i] = 1ll * f[i] * g[i] % yyb;
ntt(f, len, 1), tmp = power(len, yyb - 2);
for (i = 1; i <= n; ++i)
f[i] = 1ll * f[i] * tmp % yyb;
for (i = 1, tmp = 2; i <= n; tmp = (tmp << 1) % yyb, ++i)
h[i] = 1ll * fac[i] * fac[i] % yyb * tmp % yyb * invFac[i << 1 | 1] % yyb * invFac[n - i] % yyb;
for (i = k; i <= n; ++i)
ans = (1ll * f[i] * h[i] % yyb + ans) % yyb;
ans = 1ll * ans * fac[n] % yyb * l % yyb, printf("%d\n", (ans + yyb) % yyb);
return 0;
}

CF1153F Serval and Bonus Problem FFT的更多相关文章

  1. CF1153F Serval and Bonus Problem

    Serval and Bonus Problem 1.转化为l=1,最后乘上l 2.对于一个方案,就是随便选择一个点,选在合法区间内的概率 3.对于本质相同的所有方案考虑在一起,贡献就是合法区间个数/ ...

  2. CF1153F Serval and Bonus Problem 【期望】

    题目链接:洛谷 作为一只沉迷数学多年的蒟蒻OIer,在推柿子和dp之间肯定要选推柿子的! 首先假设线段长度为1,最后答案乘上$l$即可. 对于$x$这个位置,被区间覆盖的概率是$2x(1-x)$(线段 ...

  3. 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 ...

  4. Codeforces1153F Serval and Bonus Problem 【组合数】

    题目分析: 我们思考正好被k个区间覆盖的情况,那么当前这个子段是不是把所有的点分成了两个部分,那么在两个部分之间相互连k条线,再对于剩下的分别连线就很好了?这个东西不难用组合数写出来. 然后我们要证明 ...

  5. CF1153 F. Serval and Bonus Problem(dp)

    题意 一个长为 \(l\) 的线段,每次等概率选择线段上两个点,共选出 \(n\) 条线段,求至少被 \(k\) 条线段覆盖的长度期望. 数据范围 \(1 \le k \le n \le 2000, ...

  6. Codeforces 1153F Serval and Bonus Problem [积分,期望]

    Codeforces 思路 去他的DP,暴力积分多好-- 首先发现\(l\)没有用,所以不管它. 然后考虑期望的线性性,可以知道答案就是 \[ \int_0^1 \left[ \sum_{i=k}^n ...

  7. @codeforces - 1153F@ Serval and Bonus Problem

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 从一条长度为 l 的线段中随机选择 n 条线段,共 2*n 个线 ...

  8. 2016 acm香港网络赛 A题. A+B Problem (FFT)

    原题地址:https://open.kattis.com/problems/aplusb FFT代码参考kuangbin的博客:http://www.cnblogs.com/kuangbin/arch ...

  9. XJTUOJ wmq的A×B Problem FFT/NTT

    wmq的A×B Problem 发布时间: 2017年4月9日 17:06   最后更新: 2017年4月9日 17:07   时间限制: 3000ms   内存限制: 512M 描述 这是一个非常简 ...

随机推荐

  1. JMeter—逻辑控制器(六)

    参考<全栈性能测试修炼宝典JMeter实战>第六章 JMeter 元件详解中第一节JMeter逻辑控制器 JMeter逻辑控制器可以对元件的执行逻辑进行控制,除仅一次控制器外,其他可以嵌套 ...

  2. MSSQL一种取代游标的方案

    今天看到一篇文章写的自己整理记录下,据说比用游标快. DECLARE @字段1 数据类型; DECLARE @字段2 数据类型; DECLARE @TMP_WHILE_ID INT; ,),TMP_W ...

  3. django模板语言之Template

    当前端的一些数据需要后端传送过来并展示时,用到了django的模板语言,模板语言的作用就是,在后端把一些处理好的数据,通过模板语言所规定的格式,通过render渲染,放到前端页面固定的位置展示.这之间 ...

  4. SqlServer索引页损坏恢复

    问题背景 运维操作失误,在没有正常关闭sqlserver的情况下,将服务器关闭了,重启后某些表损坏(应该是某些页损坏了,没有损坏的页还能访问到数据,但是访问损坏了的页就有问题),目前数据库只有4.20 ...

  5. Mouse Without Borders软件,主要功能备忘录

    详细地址:https://blog.csdn.net/andylauren/article/details/64540500

  6. 6.2Python文件的操作(二)

    目录 目录 前言 (一)文件的定位 (二)文件的读操作 ==1.read()方法== ==2.readline()方法== ==3.readlines()方法== ==4.文件的遍历读法== (三)文 ...

  7. vue+webpack安装sass过程中遇到权限不够,直接删除node_modus文件夹重新安装,node_modus先取得管理员权限才能删

    vue vue-style-loader !css-loader错误 最近在学习vue框架,使用webpack打包vue项目,在执行npm run start的时候 出现如下错误: This depe ...

  8. python流程控制语句-if语句

    一个if语句 if语句用来检验一个条件, 如果 条件为真,我们运行一块语句(称为 if-块 ),也就是只有一个if判断,当为真的时候就运行一块语句,否则就不运行 下面代码中的if语句控制者缩进的pri ...

  9. C#常见委托のdelegate定义,Func,Action,Predicate总结

    委托,顾名思义,就是让其他代理,本质就是为具有共性方法组定义一个方法模板:(交流可以加qq群:435226676) 委托常见的方式有一般委托显示定义,Func<T,TResult> (T, ...

  10. 从零上手Python关键代码

    来源 https://www.kesci.com/home/project/59e4331c4663f7655c499bc3