• Solution -「CF 908G」New Year and Original Order


    (mathcal{Description})

      Link.

      对于 (xinmathbb N^*),令 (s(x)) 表示将 (x) 十进制下的各位数码排序后得到的十进制数的值。求 (sum_{i=1}^X s(i))((10^9+7)) 取模的结果。

      (Xle10^{700})

    (mathcal{Solution})

      下记 (m=10)(进制),(n=lceillog_mX ceil)

    (mathcal{Case~1})

      市面上的题解做法。

      考虑到“数码有序”的特性:(forall x,~s(x)) 可以表示为若干个 (11dots1) 之和。对于 (din[1,9])(d) 显然在 (s(x)) 中占有连续的一段,那么 (s(x)) 有形如 (sum_d underbrace{dddots d}_aunderbrace{00dots0}_b) 的形式,其中 (a) 表示 (d) 的个数,(b) 表示大于 (d) 的数码个数。根据上述特性,它可以转化为 (sum_dunderbrace{11dots1}_aunderbrace{11dots1}_b),就能直接 DP 计算啦。

      令 (f_d(i,j,0/1)) 表示当前的 (x) 填到了从高到低第 (i) 位,且有 (j) 个数码大于等于 (d),是否被 (X) 限制的方案数,转移枚举第 (i+1) 位所填的数码即可。最终答案为

    [sum_{d=1}^{m-1}sum_{l=1}^n(underbrace{11dots1}_l)f_d(n,l,0)+f_d(n,l,1) ]

      复杂度 (mathcal O(m^2n^2))

    (mathcal{Case~2})

      一种粗暴但是实用的 GF 做法。

      本节记 (v_i=underbrace{11dots1}_i)

      对于上界 (X),不管什么做法都很难带着这种限制算。考虑枚举 (x) 中从高到低第一个严格小于 (X) 的数码位置 (p) —— 即 (x) 的第 (1sim p-1) 位与 (X) 相同,第 (p) 位小于 (X)。同时,记 (c_i)(X)(1sim p-1) 位中数码 (i) 的出现次数,它们在 (x) 中亦出现,且位置已经固定。当然,还需要枚举第 (p) 位的值。

      注意到 (x) 的第 (p+1sim n) 位已经不必担心限制,可以用单纯的计数 DP 而非数位 DP 进行求解。我们以 (1sim 9) 的顺序将数码填入这 (n-p) 个位置中,没填的位置视为 (0)(不影响 (s(x)) 的值),设 DP 状态:

    • (g_{i,j}) 表示用 (1sim i) 的数码填 (j) 个位置的方案数;
    • (f_{i,j}) 表示用 (1sim i) 的数码填 (j) 个位置,得到的所有 (x)(s(x)) 之和。(再次强调,没填的位置视为 (0))。

      对于 (g_{i,j}) 的转移,枚举数码 (i) 的个数,得到

    [g_{i,j}=sum_{k=0}^jinom{j}{k}g_{i-1,j-k} ]

      对于 (f_{i,j}) 的转移,数码 (i) 会把 (s(x)) 本来的值整体向高位位移(因为 (s(x)) 当时只有 (1sim i-1) 的数码,都小于 (i)),然后低位补上 (dddots d)。具体有

    [f_{i,j}=sum_{k=0}^jinom{j}{k}left(f_{i-1,j-k}cdot m^{k+c_i}+g_{i-1,j-k}cdot iv_{k+c_i} ight) ]

      我们可以用它们表示出当前 (p) 对答案的贡献 ( ext{ans}_p) 为:

    [ ext{ans}_p=sum_{k=0}^{n-p}inom{n-p}{k}f_{m-1,k} ]

    注意 (f_{m-1,k}) 中的 (k) 只考虑了内部选位置的方案,所以外面还得带一个组合数。

      DP 在此告一段落,如此暴力求答案的复杂度是枚举前缀的 (mathcal O(nm)) 套 DP 的 (mathcal O(n^2m))(mathcal O(m^2n^3)) 的。


      接下来引入 EGF,令

    [G_i(x)=sum_{j=0}^{n-p-1}g_{i,j}x^j\ F_i(x)=sum_{j=0}^{n-p-1}f_{i,j}x^j ]

    尝试化简它们,从递推式入手:

    [g_{i,j}=sum_{k=0}^jinom{j}{k}g_{i-1,j-k}\ Rightarrow~~~~frac{g_{i,j}}{j!}=sum_{k=0}^jfrac{g_{i-1,j-k}}{(j-k)!}cdotfrac{1}{k!} ]

    后者很显然是一个卷积形式,套入 EGF 就有:

    [Rightarrow~~~~[x^j]G_i(x)=sum_{k=0}^j[x^{j-k}]G_{i-1}(x)cdot[x^k]e^x\ Rightarrow~~~~G_i(x)=e^xG_{i-1}(x)\ Rightarrow~~~~G_i(x)=e^{ix} ]

      类似的,对于 (F)

    [f_{i,j}=sum_{k=0}^jinom{j}{k}(m^{k+c_i}f_{i-1,j-k}+g_{i-1,j-k}cdot iv_{k+c_i})\ Rightarrow~~~~frac{f_{i,j}}{j!}=sum_{k=0}^jleft(frac{m^{c_i}m^k}{k!}cdotfrac{f_{i-1,j-k}}{(j-k)!}+icdotfrac{g_{i-1,j-k}}{(j-k)!}cdotfrac{m^{c_i}v_k+v_{c_i}}{k!} ight)\ Rightarrow~~~~F_i(x)=m^{c_i}e^{mx}F_{i-1}(x)+iG_{i-1}(x)left(m^{c_i}V(x)+v_{c_i}e^x ight),~~~~ ext{let }V(x)=sum_{i=0}^{+infty}v_ix^i\ Rightarrow~~~~F_i(x)=m^{c_i}e^{mx}F_{i-1}(x)+ie^{(i-1)x}(m^{c_i}V(x)+v_{c_i}e^x) ]

    发现这是关于 (F_i(x)) 的常系数线性递推,令

    [p_i=m^{c_i}e^{mx}\ q_i=ie^{(i-1)x}(m^{c_i}V(x)+v_{c_i}e^x) ]

    [F_i(x)=p_iF_{i-1}(x)+q_i ]

    美观多啦,手代一下就能展开成通项:

    [F_i(x)=sum_{k=1}^iq_kprod_{j=k+1}^ip_j ]

      进一步,代入 ( ext{ans}_p) 的式子:

    [egin{aligned} frac{ ext{ans}_p}{(n-p)!}&=[x^{n-p}]e^xF_{m-1}(x)\ &=[x^{n-p}]e^xsum_{k=1}^{m-1}q_kprod_{j=k+1}^{m-1}p_j\ &=[x^{n-p}]sum_{k=1}^{m-1}left(ke^{kx}(m^{c_k}V(x)+v_{c_k}e^x) ight)left(prod_{j=k+1}^{m-1}m^{c_j}e^{mx} ight)\ &=[x^{n-p}]sum_{k=1}^{m-1}kleft(prod_{j=k+1}^{m-1}m^{c_j} ight)(m^{c_k}e^{(m(m-1-k)+k)x}V(x)+v_{c_k}e^{(m(m-1-k)+k+1)x})\ end{aligned} ]

    卡住啦,瓶颈在于求 (e^{(m(m-1-k)+k)x}V(x))。来看看 (V(x)) 是什么……

    [egin{aligned} V(x)&=sum_{i=0}^{+infty}frac{m^i-1}{m-1}cdotfrac{x^i}{i!}\ &=frac{1}{m-1}(e^{mx}-e^x)\ &=frac{e^x}{m-1}(e^{(m-1)x}-1) end{aligned} ]

    大力丢进去,有

    [egin{aligned} e^{(m(m-1-k)+k)x}V(x)&=frac{1}{m-1}e^{(m(m-1-k)+k+1)x}(e^{(m-1)x}-1) end{aligned} ]

    天呐它果然封闭,可以 (mathcal O(1)) 算系数。那么整个算法就是 (mathcal O(nm)) 枚举 (p)(mathcal O(m))( ext{ans}_p),即 (mathcal O(m^2n)) 的。

    (mathcal{Case~3})

      来冷静并反复刺激一下大脑叭~

      研究某个 (x) 及其 (s(x)),设 (x) 中数码出现次数为 (c_{0..9}),则

    [s(x)=sum_{i=1}^{m-1}frac{m^{sum_{j=i}^{m-1}c_j}-1}{m-1} ]

    实质上就是 (mathcal{Case~1})(11dots 1) 的转化。然后类似 (mathcal{Case~2}) 地,枚举 (x)(X) 的相同前缀及下一位严格小于 (X) 的数码。还是记枚举的位置 (p),前缀中数码出现次数为 (c_{0..9})。把上式 (sum_{j=i}^{m-1}c_j) 处理为后缀和 (s_i),那么 ( ext{ans}_p)

    [ ext{ans}_p=frac{1}{m-1}sum_{i=1}^{m-1}sum_{j=0}^{n-p}inom{n-p}{j}(i-1)^{n-p-j}(m-i)^p(m^{s_i+j}-1) ]

    注意其中 (j) 枚举的是“大于等于 (i) 的数码个数”。瞪一下和式里面,显然可以把形如二项式展开的这一坨拍回去。记 (l=n-p),推一推:

    [egin{aligned} sum_{j=0}^{l}cdots&=m^{s_i}sum_{j=0}^linom{l}{j}(i-1)^{l-j}(m-i)^jm^j-(m-1)^l\ &=m^{s_i}(m(m-i)+i-1)^l-(m-1)^l end{aligned} ]

    扫前缀的过程中顺带维护一下这个式子,Tiw:可以做到 (mathcal O(mn))


      由于有些算法没写,所以都不给代码啦 awa~

  • 相关阅读:
    Appium自动化环境搭建
    真机Android 8.0版本以上uiautomator定位元素-Unsupported protocol: 2/Unexpected error while obtaining UI hierarchy错误处理
    rsa非对称加密
    QT使用OpenSSL的接口实现RSA的加密解密
    lua安装后其他库使用产生问题解决方法
    log4cpp的使用描述
    std::function和std::bind
    C++11线程睡眠的方式
    高精度计时器
    如何解决TCP拆包粘包问题
  • 原文地址:https://www.cnblogs.com/rainybunny/p/14556108.html
Copyright © 2020-2023  润新知