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\)。

  1. //written by newbiechd
  2. #include <cstdio>
  3. #include <cctype>
  4. #include <algorithm>
  5. #define BUF 1000000
  6. using namespace std;
  7. const int N = 100003, yyb = 998244353, Gg = 3, Gi = 332748118;
  8. char buf[BUF], *p1, *p2;
  9. inline char gc() { return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, BUF, stdin), p1 == p2) ? EOF : *p1++; }
  10. inline int rd() {
  11. register int f = 0;
  12. register char c;
  13. while (!isdigit(c = gc())) {}
  14. do
  15. f = f * 10 + (c ^ 48);
  16. while (isdigit(c = gc()));
  17. return f;
  18. }
  19. int rev[N], G[2][N];
  20. inline int power(int x, int y) {
  21. register int o = 1;
  22. for (; y; y >>= 1, x = 1ll * x * x % yyb)
  23. if (y & 1)
  24. o = 1ll * o * x % yyb;
  25. return o;
  26. }
  27. inline void ntt(int *f, int len, int opt) {
  28. register int i, j, k, x, y, p, q;
  29. for (i = 1; i < len; ++i)
  30. if (i < rev[i])
  31. swap(f[i], f[rev[i]]);
  32. for (i = 1; i < len; i <<= 1) {
  33. p = G[opt][i];
  34. for (j = 0; j < len; j += i << 1)
  35. for (k = 0, q = 1; k < i; ++k, q = 1ll * p * q % yyb)
  36. 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;
  37. }
  38. }
  39. int fac[N], invFac[N], f[N], g[N], h[N];
  40. int main() {
  41. #ifndef ONLINE_JUDGE
  42. freopen("a.in", "r", stdin);
  43. freopen("a.out", "w", stdout);
  44. #endif
  45. int n = rd(), m = n << 1 | 1, k = rd(), l = rd(), i, len, tmp, ans = 0;
  46. fac[0] = 1;
  47. for (i = 1; i <= m; ++i)
  48. fac[i] = 1ll * fac[i - 1] * i % yyb;
  49. invFac[m] = power(fac[m], yyb - 2);
  50. for (i = m; i; --i)
  51. invFac[i - 1] = 1ll * invFac[i] * i % yyb;
  52. for (i = k; i <= n; ++i)
  53. f[i] = invFac[i];
  54. for (i = 0; i <= n; ++i)
  55. g[i] = i & 1 ? yyb - invFac[i] : invFac[i];
  56. for (len = 1; len <= m; len <<= 1) {}
  57. for (i = 1; i < len; ++i)
  58. rev[i] = (rev[i >> 1] >> 1) | (i & 1 ? len >> 1 : 0);
  59. for (i = 1; i < len; i <<= 1)
  60. G[0][i] = power(Gg, (yyb - 1) / (i << 1)), G[1][i] = power(Gi, (yyb - 1) / (i << 1));
  61. ntt(f, len, 0), ntt(g, len, 0);
  62. for (i = 0; i < len; ++i)
  63. f[i] = 1ll * f[i] * g[i] % yyb;
  64. ntt(f, len, 1), tmp = power(len, yyb - 2);
  65. for (i = 1; i <= n; ++i)
  66. f[i] = 1ll * f[i] * tmp % yyb;
  67. for (i = 1, tmp = 2; i <= n; tmp = (tmp << 1) % yyb, ++i)
  68. h[i] = 1ll * fac[i] * fac[i] % yyb * tmp % yyb * invFac[i << 1 | 1] % yyb * invFac[n - i] % yyb;
  69. for (i = k; i <= n; ++i)
  70. ans = (1ll * f[i] * h[i] % yyb + ans) % yyb;
  71. ans = 1ll * ans * fac[n] % yyb * l % yyb, printf("%d\n", (ans + yyb) % yyb);
  72. return 0;
  73. }

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. Flutter 布局(八)- Stack、IndexedStack、GridView详解

    本文主要介绍Flutter布局中的Stack.IndexedStack.GridView控件,详细介绍了其布局行为以及使用场景,并对源码进行了分析. 1. Stack A widget that po ...

  2. Kotlin入门(11)江湖绝技之特殊函数

    上一篇文章介绍了Kotlin对函数的输入参数所做的增强之处,其实函数这块Kotlin还有好些重大改进,集中体现在几类特殊函数,比如泛型函数.内联函数.扩展函数.尾递归函数.高阶函数等等,因此本篇文章就 ...

  3. Cookie的HttpOnly、secure、domain属性

    Cookie主要属性 Cookie主要属性: path domain max-age expires:是expires的补充,现阶段有兼容性问题:IE低版本不支持,所以一般不单独使用 secure h ...

  4. 通过DbVisualizer 工具运行DB2存储过程实现INSERT语句主键自增造数

    1.需求简介 最近开发人员需要进行一批数据进行生产上SQL语句耗时过长问题的验证与优化.所以在性能测试库中批量建造数据,由于交易本身业务逻辑过于复杂以及需要各种授权,最后决定采用插表的方式完成. 2. ...

  5. python第十七天---时间模块、random模块

    作完一个作业,开始新的学习: 有由今天的时间有限所有学习了以下两个模块,明天继续! 时间模块.random模块 import time #!usr/bin/env python #-*-coding: ...

  6. Chrome及Chrome内核浏览器改变开发者工具字体大小

    1.打开浏览器,按F12调用开发者工具 2.按Ctrl+数字加号键,可看到字体变大,按Ctrl+数字减号键,字体变小 3.重新启动浏览器后字体仍然保持修改后的字体大小

  7. Request获取客户端IP

    获取客户端的IP地址的方法是:request.getRemoteAddr() ,这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了. ...

  8. Hadoop2.7.6_04_HDFS的Shell操作与常见问题

    1. HDFS的shell操作 1.1. 支持的命令及参数 [yun@mini05 zhangliang]$ hadoop fs Usage: hadoop fs [generic options] ...

  9. File类_删除一个带内容的目录_练习

    需求:删除一个带内容的目录 原理:必须从最里面往外删除需要深度遍历 import java.io.File; public class RemoveDirTest { public static vo ...

  10. Ajax进阶之原生js与跨域jsonp

    什么是Ajax? 两个数求和: 用Jquery和数据用json格式 viws函数: from django.shortcuts import render,HttpResponse # Create ...