zoukankan      html  css  js  c++  java
  • LOJ#6756. 随机数生成器

    LOJ#6756. 随机数生成器

    给定 (n,k),表示有 (n) 个初始为 (0) 的变量,操作 (k) 次,每次随机给一个数 (+1),求最大值的期望。

    • subtask1 (kle 2400,nle 400)
    • subtask2 (kle 5cdot 10^4,nle 20)

    Solution

    有幸在 LOJ 上放了一道题,当然要来题解啦。(虽然这个题的做法是 EI 鸽鸽教导我的。)

    subtask1 就是容斥一下可以得到一个调和级数的系数,或者直接 min-max 反演也可以,然后就可以 (mathcal O(k^2ln k)) 的递推了。

    subtask2 的话大概基于以下的分析:

    (F_z(x)=sum_j [jle z]frac{x^j}{j!}),那么我们可以在 (mathcal O(nk)) 的复杂度计算 (F_z(x)^n)(求导 + 递推)

    我们需要求的是为 (z=1,2...k) 计算 (F_z(x)^n[x^k])

    考虑分块,我们每隔 (cnt) 个位置设置一个关键点,设当前考虑到的关键点为 (m)

    我们先计算出 (F_m(x)^n),并以此为基础考虑 (F_{m+t}(x)^n[x^k])

    可以注意到:(F_{m+t}(x)=F_m(x)+A(x))

    故:

    [F_{m+t}(x)^n=sum_j inom{n}{j}F_m(x)^{n-j}A(x)^{j} ]

    我们可以发现 (A(x)^j) 的最低次幂为 (j imes (m+1)),所以当 (j> frac{k}{m}) 时我们就不需要求了。

    只需要为 (A(x)) 计算前 (1,2,3...frac{k}{m}) 项。

    这个可以求导 + 递推处理,复杂度 (mathcal O(frac{k^2}{m}))

    然而这样太暴力了,可以观察到,(A(x)^j) 只有 (tj) 项。

    我们只枚举这 (tj) 项就可以将这个部分的复杂度降低为 (mathcal O(t imes frac{k^2}{m^2}))

    事实上,由于我们最多只需要计算前 (n) 次幂,所以为一个 (t) 进行计算的复杂度为 (mathcal O(t imes min(frac{k}{m},n)^2))

    tips: 于是我们只需要预处理 (F_m(x)^1,F_m(x)^2...F_m(x)^n)

    于是我们如果每隔 (cnt) 个位置设置关键点,那么我们会设置 (frac{k}{cnt}) 个关键点,为每个关键点预处理的复杂度为 (mathcal O(nk)),这个部分的复杂度为 (mathcal O(nfrac{k^2}{cnt}))

    接下来考虑为每个关键点计算 (m+t) 处的答案的复杂度,单点计算的复杂度为 (t imes min(n,frac{k}{m})^2),总复杂度为 (min (frac{k}{m},n)^2 imes cnt^2)

    方便起见设 (m=rcdot cnt),于是当 (rcdot cntle frac{k}{n}) 时,单次计算的复杂度为 (n^2 imes cnt^2),这个部分需要计算 (frac{k}{ncdot cnt}) 次,复杂度为 (mathcal O(nkcdot cnt))

    (rcdot cntge frac{k}{n}) 时,单次计算的复杂度为 (mathcal O(frac{k^2}{r^2})),这个部分的复杂度和为:

    [sum_{r=(k/(ncdot cnt))}^{k/cnt}frac{k^2}{r^2}le k^2int_{k/(ncdot cnt)}^{k/cnt}frac{1}{x^2}dx=k^2(frac{ncnt}{k}-frac{cnt}{k})=nkcdot cnt ]

    于是总体复杂度为 (mathcal O(nkcdot cnt+frac{nk^2}{cnt})),取 (cnt=sqrt{k}) 可以得到最优复杂度为 (mathcal O(nk^{1.5}))

    如果追求更优的理论复杂度,可以将 (nk) 递推的部分全部换成 (ln+exp),再通过对小部分的暴力来均摊复杂度,可以得到 (mathcal O( extrm{poly}~ k^{frac{5}{3}}))

  • 相关阅读:
    C++基础学习笔记----第十三课(操作符重载-下)
    SSH搭建
    java(17)
    英语语法检查软件
    Ubuntu sudo apt-get 安装下载更新软件包命令详解
    MATLAB:控制系统模型变换
    solvepnp
    MATLAB:控制系统模型变换
    MATLAB实现传递函数
    visual studio编译cmake opencv一直出错
  • 原文地址:https://www.cnblogs.com/Soulist/p/14165425.html
Copyright © 2011-2022 走看看