1 条题解

  • 0
    @ 2025-8-24 22:46:54

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar meyi
    明日黄花

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

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

    以下是正文


    对于每个有传送带的平台 ii,系统复位的条件是,到达该平台的行李箱数恰好是 rir_i​ 的倍数。

    直接计算到达每个平台的行李箱数是困难的,但是根据上面的结论,到达每个平台的行李箱数都是其传送带数量的倍数,因此其连接的每条传送带传出的行李箱数也一定相等。

    将最开始放在 11 号平台上的一个单位流量视作整体处理过程的基准。接下来,每个平台 ii 接收到的流量(记作 flowiflow_i)则可以表示:如果我们放出一个单位流量的行李箱,那么平台 ii 最终收到的箱子为 flowiflow_i 个单位流量,显然这是个有理数。

    对于一个拥有 rir_i 条传送带的平台,传送箱子时均分给每条传送带,所以每条传送带传出的流量为

    fi=flowiri.f_i = \frac{flow_i}{r_i}.

    传送带仅从较小编号的平台通向编号更大的平台,这保证了整个系统构成一个 DAG,使得我们可以按编号从小到大开始依次计算 flowiflow_i

    对于每个有传送带的平台 ii,总共处理了 XX​ 个行李箱后,该平台收到的行李箱数为

    X×flowi.X \times \mathit{flow}_i.

    由于平台的传送带采用循环调度,只有当上面这个数是 rir_i 的倍数时,平台的状态才会复位。换句话说,我们要求

    X×flowiriZ.X \times \frac{flow_i}{r_i} \in \mathbb{Z}.

    也即

    X×fiZ.X \times f_i \in \mathbb{Z}.

    不妨假设 fif_i 的最简分数表示为 piqi\frac{p_i}{q_i},其中 pi,qiZ+p_i,q_i\in \mathbb{Z}^+gcd(pi,qi)=1\gcd(p_i,q_i)=1,那么上式等价于

    qiX.q_i \mid X.

    可知

    X=lcmi=1n qi.X = \mathop{\text{lcm}}\limits_{i=1}^n\ q_i.

    即为答案。

    显然 XX 的值可能很大,又因本题涉及到分数运算,因此使用 Python 实现。

    from fractions import Fraction
    from math import lcm
    
    n = int(input())
    to = []
    for i in range(n):
        to.append([j - 1 for j in list(map(int, input().split()))[1:]])
    flow = [Fraction(1)] + [Fraction(0)] * (n - 1)
    X = 1
    for i in range(n):
        if to[i]:
            f = flow[i] / len(to[i])
            X = lcm(f.denominator, X)
            for j in to[i]: flow[j] += f
    print(X)
    
    • 1

    信息

    ID
    8694
    时间
    1000ms
    内存
    512MiB
    难度
    4
    标签
    递交数
    0
    已通过
    0
    上传者