Live2D

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

Description

  Link.

  对于 xN,令 s(x) 表示将 x 十进制下的各位数码排序后得到的十进制数的值。求 i=1Xs(i)(109+7) 取模的结果。

  X10700

Solution

  下记 m=10(进制),n=logmX

Case 1

  市面上的题解做法。

  考虑到“数码有序”的特性:x, s(x) 可以表示为若干个 111 之和。对于 d[1,9]d 显然在 s(x) 中占有连续的一段,那么 s(x) 有形如 dddda000b 的形式,其中 a 表示 d 的个数,b 表示大于 d 的数码个数。根据上述特性,它可以转化为 d111a111b,就能直接 DP 计算啦。

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

d=1m1l=1n(111l)fd(n,l,0)+fd(n,l,1)

  复杂度 O(m2n2)

Case 2

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

  本节记 vi=111i

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

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

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

  对于 gi,j 的转移,枚举数码 i 的个数,得到

gi,j=k=0j(jk)gi1,jk

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

fi,j=k=0j(jk)(fi1,jkmk+ci+gi1,jkivk+ci)

  我们可以用它们表示出当前 p 对答案的贡献 ansp 为:

ansp=k=0np(npk)fm1,k

注意 fm1,k 中的 k 只考虑了内部选位置的方案,所以外面还得带一个组合数。

  DP 在此告一段落,如此暴力求答案的复杂度是枚举前缀的 O(nm) 套 DP 的 O(n2m)O(m2n3) 的。


  接下来引入 EGF,令

Gi(x)=j=0np1gi,jxjFi(x)=j=0np1fi,jxj

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

gi,j=k=0j(jk)gi1,jk    gi,jj!=k=0jgi1,jk(jk)!1k!

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

    [xj]Gi(x)=k=0j[xjk]Gi1(x)[xk]ex    Gi(x)=exGi1(x)    Gi(x)=eix

  类似的,对于 F

fi,j=k=0j(jk)(mk+cifi1,jk+gi1,jkivk+ci)    fi,jj!=k=0j(mcimkk!fi1,jk(jk)!+igi1,jk(jk)!mcivk+vcik!)    Fi(x)=mciemxFi1(x)+iGi1(x)(mciV(x)+vciex),    let V(x)=i=0+vixi    Fi(x)=mciemxFi1(x)+ie(i1)x(mciV(x)+vciex)

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

pi=mciemxqi=ie(i1)x(mciV(x)+vciex)

Fi(x)=piFi1(x)+qi

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

Fi(x)=k=1iqkj=k+1ipj

  进一步,代入 ansp 的式子:

ansp(np)!=[xnp]exFm1(x)=[xnp]exk=1m1qkj=k+1m1pj=[xnp]k=1m1(kekx(mckV(x)+vckex))(j=k+1m1mcjemx)=[xnp]k=1m1k(j=k+1m1mcj)(mcke(m(m1k)+k)xV(x)+vcke(m(m1k)+k+1)x)

卡住啦,瓶颈在于求 e(m(m1k)+k)xV(x)。来看看 V(x) 是什么……

V(x)=i=0+mi1m1xii!=1m1(emxex)=exm1(e(m1)x1)

大力丢进去,有

e(m(m1k)+k)xV(x)=1m1e(m(m1k)+k+1)x(e(m1)x1)

天呐它果然封闭,可以 O(1) 算系数。那么整个算法就是 O(nm) 枚举 pO(m)ansp,即 O(m2n) 的。

Case 3

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

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

s(x)=i=1m1mj=im1cj1m1

实质上就是 Case 1111 的转化。然后类似 Case 2 地,枚举 xX 的相同前缀及下一位严格小于 X 的数码。还是记枚举的位置 p,前缀中数码出现次数为 c0..9。把上式 j=im1cj 处理为后缀和 si,那么 ansp

ansp=1m1i=1m1j=0np(npj)(i1)npj(mi)p(msi+j1)

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

j=0l=msij=0l(lj)(i1)lj(mi)jmj(m1)l=msi(m(mi)+i1)l(m1)l

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


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

posted @   Rainybunny  阅读(64)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示