1 条题解

  • 0
    @ 2025-8-24 22:07:31

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar ftiasch
    这个学院最强大的女孩子的朋友

    搬运于2025-08-24 22:07:31,当前版本为作者最后更新于2022-12-30 13:15:54,作者可能在搬运后再次修改,您可在原文处查看最新版

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

    以下是正文


    这是一篇关于常数的题解,截止 2022 年 12 月 30 日我是最优解。

    算法的常数

    为了方便分析,假设 n=2k1n=2^k - 1,也就是 k=O(logn)k = O(\log n).

    如果使用矩阵乘法,两个 2×22 \times 2 的矩阵相乘需要 88 次乘法(如果考虑 Strassen algorithm 则是 7 次),所以计算 MnM^n 需要 16k16k 次乘法(8k8k 次平方,8k8k 次乘法)。

    一个更好的方法是设 A(n)=anA(n) = a^nB(n)=bnB(n) = b^nS(n)=i=0aibniS(n) = \sum_{i = 0} a^i b^{n - i}。我们有递归关系:

    • nn 是偶数的时候,A(n)=(A(n/2))2A(n) = (A(n/2))^2B(n)=(B(n/2))2B(n) = (B(n/2))^2, S(n)=S(n/2)(A(n/2)+B(n/2))A(n/2)B(n/2)S(n) = S(n/2)\,(A(n/2) + B(n/2)) - A(n/2)\,B(n/2),这需要 44 次乘法。
    • nn 是奇数的时候,A(n)=aA(n1)A(n) = a\,A(n-1), B(n)=bB(n1)B(n) = b\,B(n-1)S(n)=aS(n1)+B(n)S(n) = a\,S(n - 1) + B(n),这需要 33 次乘法。

    所以计算 S(n)S(n) 需要 7k=4k+3k7k=4k+3k 次乘法。

    当然,当 nn 是奇数的时候,我们可以先计算 A=aA(n/2)A' = a\,A(n/2)B=bB(n/2)B' = b\,B(n/2),然后 S(n)=S(n/2)(A+B)S(n) = S(n/2)\,(A' + B'), A(n)=AA(n/2)A(n) = A'\,A(n/2), B(n)=BB(n/2)B(n)=B'B(n/2),这需要 5 次乘法。总共计算 S(n)S(n) 需要 5k5k 次乘法。

    实现的常数

    根据我的 benchmark,在 64 位模数下,Barrett Multiplication 比直接调用 % 快 4 倍。

    -------------------------------------------------------------------------------
    mod_64 - BarrettMod64T<>
    
    benchmark name                            samples    iterations          mean
    bench                                          100             3     4.5259 us 
    
    -------------------------------------------------------------------------------
    mod_64 - NonConstMod64T<>
    
    benchmark name                            samples    iterations          mean
    bench                                          100             1    19.6215 us 
    ===============================================================================
    

    所以你应该使用 Barrett Multiplication。

    最后加上快速读入。

    • 1

    信息

    ID
    4102
    时间
    1000ms
    内存
    125MiB
    难度
    6
    标签
    (无)
    递交数
    0
    已通过
    0
    上传者