1 条题解

  • 0
    @ 2025-8-24 22:51:41

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar muqi132
    **

    搬运于2025-08-24 22:51:41,当前版本为作者最后更新于2024-10-24 13:08:36,作者可能在搬运后再次修改,您可在原文处查看最新版

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

    以下是正文


    P9768 A+B题解

    我们首先注意到每一列是绑定在一起的,同时这一列能否成立只与前一列是否要求进位以及后一列是否进位有关。

    所以我们观察到每一列有两个性质:自己能能否产生进位,自己是否需要进位,我们令 needneed 为每一列需要的进位数,makemake 用来描述这一列是否产生进位。

    首先如果 needneed 大于 11 那么我们直接输出 00 即可,因为在加法中进位数不可能超过 11

    我们根据 needneedmakemake 的值的不同将各列划分为四种点。

    1. need=make=1need=make=1,为 AA 类点。
    2. need=1,make=0need=1,make=0,为 BB 类点。
    3. need=0,make=1need=0,make=1,为 CC 类点。
    4. need=make=1need=make=1,为 DD 类点。

    A,B,C,DA,B,C,D 四类点的数目分别为 A,B,C,DA,B,C,D

    对于首位的,其不能产生进位,也就是 AA 类点,BB 类点才能作为开头。

    对于末尾的,其不能需要进位,也就是 AA 类点,CC 类点才能作为结尾。

    观察性质可以发现,所有合法序列都形如_B_C_C_B_CB_C_\_B\_C\_C\_B\_C…B\_C\_

    那么 AA 类点只存在于 BB 类点前的空格以及最后一个空格(有 B+1B+1 个位置可以选择), DD 类点只存在于 CC 类点前的空格(有 BB 个位置可以选择)。

    注意到只能以 AA 类点 BB 类点开头,以 AA 类点 CC 类点结尾,且 AA 类点无法放在 BB 类点之后,那么可以说明每个 BB 类点都与一个 CC 类点匹配,即 B=CB=C。(根据 needneedmakemake 值的不同可以判断各点之间必须满足的位置关系)。

    我们首先来考虑没有前导零的情况。

    如果 B=C=0D>0B=C=0,D>0 的话,AA 类点无论是前后都不能接 DD 类点,答案为 00,如果此时 D=0D=0,那么答案为 A!A!,因为 AA 类点可以自由排列。

    如果 B=C>0B=C>0,则依次考虑每个数的情况。

    1. AA:其放在BB前的任意位置或者最后一个位置,也就是一共 BB 个挡板,求 AA 个球有多少种放法,答案为(A+B)!B!\frac{(A+B)!}{B!}
    2. B,CB,C:显然都是 B!B! (注意 B=CB=C)。
    3. DD:和 AA 同理,但是少一个位置,答案是(D+B1)!(B1)!\frac{(D+B-1)!}{(B-1)!}

    最后答案就是各自相乘为(A+B)!×(D+B1)!×B(A+B)!\times(D+B-1)!\times{B}

    前面都没有考虑前导零,那么现在我们需要考虑了。

    因为开头是 AA 类点或者 BB 类点,所以我们只需要考虑 AA 类点和 BB 类点为0的情况,分别记数量为 A0,B0A_0,B_0

    首先是特判,B!=CB!=C 或者 B=C=0D>0B=C=0,D>0 都返回 00,若 B=C=D=0B=C=D=0,则答案容易知道为:(A1)!(AA0)(A-1)!(A-A_0),解释如下:第一个位置有 (AA0)(A-A_0) 种放法,后面的位置就可以全排了。

    然后考虑一般情况,即 B=C>0B=C>0

    我们考虑对于以 AA 类点为起点和以 BB 类点为起点各自单独计算 ansAans_AansBans_B

    1. ansAans_A:对于 AA 类点,此时第一位为情况为 AA0A-A_0 种,后面就是 A1A-1 个数放入 B+1B+1 个空间了,AA 类点的贡献为 (AA0)×(A+B1)!B!(A-A_0)\times\frac{(A+B-1)!}{B!}B,C,DB,C,D 类点贡献不变,则 $ans_A=(A-A_0)\times\frac{(A+B-1)!}{B!}\times{B!}\times{B!}\times\frac{(D+B-1)!}{(B-1)!}=(A-A_0)\times{B}\times(A+B-1)!\times(D+B-1)!$。

    2. ansBans_B:对于 AA 类点,现在有 BB 个挡板,答案为 (A+B1)!(B1)!\frac{(A+B-1)!}{(B-1)!},对于 BB 类点,第一个位置有 (BB0)(B-B_0) 种情况,后面则是 (B1)!(B-1)! 种情况,对于 C,DC,D 类点来说情况不变,则 $ans_B=(B-B_0)\times(B-1)!\times{B!}\times\frac{(A+B-1)!}{(B-1)!}\times\frac{(D+B-1)!}{(B-1)!}=(B-B_0)\times{B}\times(A+B-1)!\times(D+B-1)!$。

    最后答案就是 ansA+ansBans_A+ans_B

    记得取模就行(代码应该不用放吧,直接套公式进去就行了)。

    由于对每一位都要进行一次 O(1)O(1) 的运算判断点的类型,因此复杂度是 O(n)O(n) 的。

    • 1

    信息

    ID
    8702
    时间
    1000ms
    内存
    128MiB
    难度
    5
    标签
    递交数
    0
    已通过
    0
    上传者