zoukankan      html  css  js  c++  java
  • 【ZJOI2020】抽卡

    题目描述

    (quad) 传送门

    题解


    (quad) 开始之前,先给出两个定义。

    (quad) 合法的定义:存在标号连续的 (k) 张牌。

    (quad) 不合法的定义:不存在标号连续的 (k) 张牌。

    非满分方法一 : 期望得分 (70)

    (quad) ( ext{Min-Max}) 容斥,都快烂大街了。这里就不讲了。

    非满分方法二 : 期望得分 (90)

    (quad) 我们设 (f_{i}) 表示抽了 (i) 轮不合法的方案数目。

    (quad) 可以得到:

    [ans = sumlimits_{i=0}^{infty}frac{f_{i}}{m^{i}} = 1+sumlimits_{i=1}^{infty}frac{f_{i}}{m^{i}} ]

    (quad) 考虑抽了 (i) 轮以后有 (R) 张卡,那么可以得到:

    [f_{i} = mathcal T(i,R)mathcal P(R) ]

    (quad) 其中 (mathcal T(i,R)) 代表抽了 (i) 轮抽到这 (R) 张卡的方案数目,(mathcal P(R)) 代表在 (m) 张卡中抽 (R) 张卡不合法的方案数目。

    (mathcal T(i,R)) 的答案显然,即:

    [mathcal T(i,R) = sumlimits_{t=0}^{R-1}(-1)^{t}{R choose t}(R-t)^{i} ]

    (quad) 带入暴力求和可以发现最后是一个 ( ext{NTT}) 可以处理的形式,设那个部分 ( ext{NTT}) 的结果为 (mathcal H(i)),最后的答案为:

    [ans = 1+sumlimits_{i=1}^{m}mathcal H(i)mathcal P(i) ]

    (quad) 问题在于怎么求解 (mathcal P) ,我们把长度为 (m) 的段先成一段一段连续的部分,最后 ( ext{NTT}) 合并即可。

    (quad) 我们不妨设当前段的长度为 (n)。考虑 (mathcal P(i))组合意义。就是把 (i) 个无标号的小球放入 (n-i+1) 有标号的盒子当中的方案数目。

    [mathcal P(i) = sumlimits_{t=0}^{lfloor{frac{i}{k}} floor}(-1)^{t}{n-i-1 choose t}{n-tk choose i-tk} ]

    (quad) 直接暴力计算,可以得到这个算法的瓶颈复杂度为 (mathcal O(dfrac{m^2}{k}+mlog_2^2m))

    满分做法一

    (quad) 我们尝试考虑 一个连续段不合法方案 的生成函数:

    [[x^{n-r+1}](sumlimits_{i=0}^{k-1}x^i)^r ]

    (quad) 上面的式子的含义解释如下:我们选出一段卡牌,然后强制后一个不选,但是强制选出的卡牌又不能超过 (k) 个,然后我们枚举有 (r) 张卡牌强制不选,那么前面 ([x^{n-r+1}]) 的含义就是选出 (n-r+1) 张卡牌不合法的方案数。

    (quad) 我们转换一下上面的式子:
    特性它

    [[x^{n+1}]left(xsumlimits_{i=0}^{k-1}x^i ight)^r ]

    (quad) 我们令:

    [G(x) = xsumlimits_{i=0}^{k-1}x^i =frac{x^{k+1}-x}{x-1} ]

    (quad) 我们可以得到就是要求这个:

    [[x^{n+1}]left(G(x) ight)^r ]

    (quad) 我们考虑二元生成函数:

    [H(u,G(x)) = frac{1}{1-uG(x)} ]

    (quad) 我们提取 (H(u,x))(n+1) 项系数即可。 那么这么做为什么是对的呢?我们可以这么看:

    [[x^{n+1}]H(u,G(x)) = [x^{n+1}]sumlimits_{r}u^r(G(x))^r ]

    [=sumlimits_{r}[x^{n+1}](G(x))^ru^r ]

    (quad) 我们发现,因为 (G) 的常数项系数为 (0) ,所以当 (r ge n+1) 的时候,([x^{n+1}](G(x))^r = 0),所以我们这么做是对的。

    (quad) 那么虽然我们知道要提取系数,但是我们真的不知道要怎么处理。其实这个式子已经在暗示我们用拉格朗日反演了,因为它只要求某一项的系数。

    (quad) 所以我们可以使用拓展拉格朗日反演,我们可以得到:

    [[x^{n+1}]H(u,G(x)) = frac{1}{n+1}[x^n]frac{u}{(1-ux)^2} left(frac{x}{G^{-1}(x)} ight)^{n+1} ]

    (quad) 其中 (G^{-1}(x))(G(x)) 的复合逆,我们可以用 (O(nlog_2n))( ext{Newton}) 迭代解出。

    (quad) 我们尝试把中间带 (u)这个打开,那么我们可以得到:

    [[x^{n+1}]sumlimits_{r}u^r(G(x))^r=frac{1}{n+1}sumlimits_{r}[x^n](r+1)u^{r+1}x^rleft(frac{x}{G^{-1}(x)} ight)^{n+1} ]

    (quad) 所以,我们现在直接比对两边的 (u) 的系数即可得到:((G(x))^r)

    (quad) 特别注意,我们这里 ((G(x))^r) 的意义为:选出 (n-r+1) 张卡牌不合法的方案数。所以最后一定要反转系数!

    满分做法二

    (quad) 我不会这个奇怪的组合意义...如果未来是水平到了这个地步我会来填坑的...

    (quad) 答案的生成函数为:

    [f = sumlimits_{uge 0}(-x^k)^{u}(1+x)^{n-(k+1)u}{n-ku choose u}+sumlimits_{u ge 1}(-x^{k})^{u}(1+x)^{n-(k+1)u+1}{n-ku choose u} ]

    (quad) 可以直接采用分治 ( ext{NTT}) 解决。

    满分做法三

    (quad) 深入分析 ( ext{Min-Max}) 容斥,可以将其复杂度优化至 (mathcal O(dfrac{m^2}{k^2})) 。然后可以发掘 (mathcal H) 的一个 (mathcal O(mlog_2^2m)) 的做法,可以避免牛顿迭代。但是我不会,以后有空补上...

  • 相关阅读:
    逻辑分支
    iOS开发——NSArray中的字符串排序
    iOS开发——实时监控网速(仅作参考,发现一点问题)
    iOS10适配——相机,通讯录,麦克风等权限设置
    iOS10适配——Push Notifications
    iOS开发——获取当前屏幕显示的viewcontroller
    iOS开发——应用图标上显示消息数量
    iOS开发——获取手机当前WiFi名和MAC地址
    我是一个线程(写的太好了,忍不住转过来)
    iOS开发——WAVE音频文件解析
  • 原文地址:https://www.cnblogs.com/jvruotyy/p/13970272.html
Copyright © 2011-2022 走看看