1 条题解

  • 0
    @ 2025-8-24 22:29:22

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar yyandy
    /oh

    搬运于2025-08-24 22:29:22,当前版本为作者最后更新于2023-07-17 12:02:03,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    「EZEC-6」0-1 Trie

    现在 tlx 有 nn1\mathbf{1}mm0\mathbf{0},你需要把它们排列,但要保证任意的 1\mathbf{1} 互不相邻且第一个位置是 0\mathbf{0}、最后一个位置是 1\mathbf{1},现在把所有可以构造出的串放到一棵 0-1 Trie 上,需要多少个节点?

    注意:节点计数时,不计算最开始的空节点,只计算代表“ 0\mathbf{0} ”、“ 1\mathbf{1} ”的节点。


    T2×106,n,m5×1018T\le 2\times 10^6,n,m\le 5\times 10^{18}

    一道有一定难度的题,大概想了一个小时(还是太菜了

    个人的做法比较愚笨复杂,其他题解可能有更加优秀的解法。

    保证任意两个 11 互不相邻这个条件比较阴间,尝试将一个 11 强制与一个 00 捆绑起来,形成 0101

    Fx,yF_{x,y} 为有 xx 个连续的 0101yy 个单独的 00 的字典树节点数。

    考虑这个字典树根节点的左右子树,如图所示:

    图中用红色圈起的是有 xx 个连续的 0101yy 个单独的 00 的字典树。

    它的左儿子这边,也就是绿色圈起的,是去掉一个 0101 以后的字典树。

    而右儿子这边,是去掉一个 00 之后的字典树。

    整个红圈里的字典树就相当于绿圈里的加上蓝圈里的再加上两个节点。

    于是可以得到 Fx,y=Fx1,y+Fx,y1+2,(x>1,y1)F_{x,y}=F_{x-1,y}+F_{x,y-1}+2,(x>1,y \ge 1) 的递推关系。

    其中边界条件为 F1,y=y+2,Fx,0=2xF_{1,y}=y+2,F_{x,0}=2x

    因为此时所有的节点形成了一条链,节点数就是链长。

    F1,y=yF_{1,y}=y 是因为题目里写了最后一个位置是 11,所以至少有一个连续的 0101)。

    然后整个 FF 大概是这样的:

     列0  列1 列2 列3  列4
    1: 2   3   4   5   6 
    2: 4   9  15  22  30
    3: 6  17  34  58  90
    4: 8  27  63 123 215
    

    除了第一行,都满足 Fx,y=Fx1,y+Fx,y1+2F_{x,y}=F_{x-1,y}+F_{x,y-1}+2

    这样,我们总能够将 Fn,mF_{n,m} 表示为 kj×F1,j+k0×2\sum k_j \times F_{1,j} + k_0\times 2 这样的形式。

    对于 n>1n>1kjk_j 的系数相当于在网格图中从 (2,j)(2,j) 走到 (n,m)(n,m) 路径数(只能向右或者向下)。

    kj=(n+mj2n2)k_j=\binom{n+m-j-2}{n-2}

    而接下来要解决的就是 k0k_0 的问题了。

    这个 k0k_0 相当于从 i2,j0\forall i\ge 2,j\ge 0 (i,j)(i,j)(n,m)(n,m) 的路径数量之和。

    k0=i=2nj=0m(n+mijni)k_0=\sum_{i=2}^n\sum_{j=0}^m \binom{n+m-i-j}{n-i}

    根据上指标求和的式子,可以得到

    $k_0=\sum_{i=2}^n \binom{n+m-i+1}{n-i+1}=\sum_{i=2}^n\binom{n+m-i+1}{m}=(\sum_{i=2}^{n+1}\binom{n+m-i+1}{m})-1$

    再用一次上指标求和,得到

    k0=(n+mm+1)1k_0=\binom{n+m}{m+1}-1

    加上前面的这些式子,暴力求是单次 O(m)O(m) 的。

    回来解决前面的这些式子。

    $\sum_{j=0}^mk_j\times F_{1,j}=\sum_{j=0}^m(j+2)\times \binom{n+m-j-2}{n-2}$

    =j=0m(mj+2)×(n+j2n2)=\sum_{j=0}^m (m-j+2)\times \binom{n+j-2}{n-2}

    $=\sum_{j=0}^m (\sum_{k=1}^{m-j+1} \binom{n+j-2}{n-2})+\binom{n+j-2}{n-2}$ 改变一下循环的顺序,把外面的 (n+j2n2)\binom{n+j-2}{n-2}这一坨上指标求和。

    $=(\sum_{k=1}^{m+1}\sum_{j=0}^{k-1 }\binom{n+j-2}{n-2})+\binom{n+m-1}{n-1}$ 上指标求和。

    $=(\sum_{k=1}^{m+1}\binom{n+k-2}{n-1})+\binom{n+m-1}{n-1}$ 再次上指标求和。

    =(n+mn)+(n+m1n1)=\binom{n+m}{n}+\binom{n+m-1}{n-1}

    将式子整理一下

    得到总的式子:

    $F_{n,m}=\binom{n+m}{n}+\binom{n+m-1}{n-1}+2\times \binom{n+m}{m+1}-2$

    已经可以求值了,不过如果你要精益求精的话,还可以继续化简,这一步不难(读者自证

    最终式子为 2×(n+m+1n)(n+m1n)22\times \binom{n+m+1}{n}-\binom{n+m-1}{n}-2,这样就可以只求两次组合数了。

    • 1

    信息

    ID
    6460
    时间
    1500ms
    内存
    500MiB
    难度
    6
    标签
    递交数
    0
    已通过
    0
    上传者