1 条题解

  • 10
    @ 2025-3-7 16:08:26

    普及一下线性代数科技。

    认为本题中数据组数 T106T\le 10^6,项数 n1018n\le 10^{18}

    矩阵

    如下定义一个 nnmm 列的矩阵 AA

    $$\begin{bmatrix}A_{1,1}&\dots&A_{1,m}\\\vdots&\ddots&\vdots\\A_{n,1}&\dots&A_{n,m}\end{bmatrix} $$

    n,mn,m 分别为矩阵的行数和列数。矩阵 AAii 行第 jj 列的元素被记作 Ai,jA_{i,j}

    称两个矩阵相等,当且仅当她们行数和列数相同,且每个位置上的元素相同。

    矩阵乘法

    定义

    nnmm 列的矩阵 AAppqq 列的矩阵 BB 能进行矩阵乘法运算,当且仅当 m=pm=p。其结果为一个 nnqq 列的矩阵 CC,满足 Ci,j=k=1mAi,kBk,jC_{i,j}=\sum\limits_{k=1}^mA_{i,k}B_{k,j}

    结合律

    由于本题的需要,文中只介绍行数和列数均为 nn 的情况。

    Lemma\bold {Lemma}

    对于三个 nnnn 列的矩阵 A,B,CA,B,C,有 A×B×C=A×(B×C)A\times B\times C=A\times (B\times C)

    Proof\bold{Proof}

    等式左右的运算结果都是 nnnn 列的矩阵,因此只需要证明两个矩阵中对应位置的元素相等。我们有:

    $$(A\times B)_{i,j}=\sum\limits_{k=1}^nA_{i,k}B_{k,j} $$$$\begin{aligned}(A\times B\times C)_{i,j}&=\sum\limits_{k=1}^n(A\times B)_{i,k}C_{k,j}\\&=\sum\limits_{k_1=1}^nC_{k_1,j}\sum\limits_{k_2=1}^nA_{i,k_2}B_{k_2,k_1}\\&=\sum\limits_{k_1=1}^n\sum\limits_{k_2=1}^nA_{i,k_2}B_{k_2,k_1}C_{k_1,j}\end{aligned} $$$$(B\times C)_{i,j}=\sum\limits_{k=1}^nB_{i,k}C_{k,j} $$$$\begin{aligned}[A\times (B\times C)]_{i,j}&=\sum\limits_{k=1}^nA_{i,k}(B\times C)_{k,j}\\&=\sum\limits_{k_1=1}^nA_{i,k_1}\sum\limits_{k_2=1}^nB_{k_1,k_2}C_{k_2,j}\\&=\sum\limits_{k_1=1}^n\sum\limits_{k_2=1}^nA_{i,k_1}B_{k_1,k_2}C_{k_2,j}\end{aligned} $$

    容易发现两个结果的和式之间的区别仅仅是交换求和顺序,因此 $(A\times B\times C)_{i,j}=[A\times (B\times C)]_{i,j}$。所以命题得证。

    Q.E.D.\mathcal{Q.E.D.}

    分配律

    矩阵乘法 一般不具有分配律

    回到本题

    记斐波那契数列为 ff。本题要求 fnf_n。记 Fi=[fifi+100]F_i=\begin{bmatrix}f_i&f_{i+1}\\0&0\end{bmatrix}。根据斐波那契数列的定义 fi=fi2+fi1f_i=f_{i-2}+f_{i-1} 可以得到:

    $$F_i\times \begin{bmatrix}0 &1\\1&1\end{bmatrix}=F_{i+1}$$

    那么 FnF_n 可以通过 F0F_0 乘以 nn[0111] \begin{bmatrix}0 &1\\1&1\end{bmatrix} 得到。根据矩阵乘法的结合律,我们有:

    $$F_n=F_0\times \begin{bmatrix}0 &1\\1&1\end{bmatrix}^n$$

    接下来记 G=[0111]G=\begin{bmatrix}0 &1\\1&1\end{bmatrix}

    快速幂

    如果直接枚举一遍乘起来这篇题解就没有存在的必要了。记 nn 的二进制表示中为 11 的位置依次为 [a1,,ak][a_1,\dots,a_k],则:

    Gn=i=1kG2aiG^n=\prod\limits_{i=1}^kG^{2^{a_i}}

    gi=G2ig_i=G^{2^i}。考虑 gi=gi12g_i=g^2_{i-1},那么我们就可以 O(logn)\mathcal{O}(\log n) 次递推 gig_i。接下来把所有 gaig_{a_i} 乘起来即可得到 GnG^n。再用 F0F_0 乘以 GnG^n 即可得到目标矩阵。最后输出第一行第一列的元素即可。

    时间复杂度 O(Tωlogn)\mathcal{O}(T\omega\log n)。其中 ω\omega 为矩阵乘法复杂度,本题中可以认为是 O(1)\mathcal{O}(1)

    光速幂

    T107T\le 10^7n1014n\le 10^{14} 时,能不能再给力一点?

    能的兄弟,能的。我们考虑一个阈值 BB,则 nn 可以表示成 kB+rkB+r,其中 r[0,B)r\in[0,B)

    NNnn 的上界。

    我们考虑 Gn=(GB)k×GrG^n=\left(G^B\right)^k\times G^r。预处理 hi=Gi,i[1,B]h_i=G^i,i\in [1,B],$H_i=h_B^i,i\in\left[1,\left\lfloor\dfrac{N}{B}\right\rfloor\right]$。那么 Gn=Hk×hrG^n=H_k\times h_r。这样单次查询只需要做一次矩阵乘法,时间复杂度为 O(ω)\mathcal{O}(\omega)

    至于预处理,时间复杂度为 O(B+NB)\mathcal{O}\left( B+\dfrac{N}{B}\right)。根据我们在数学必修一学过的均值不等式知识,可知当 B=O(N)B=\mathcal{O}\left(\sqrt N\right) 时最优时间复杂度为 O(N)\mathcal{O}\left(\sqrt N\right)

    于是我们得到了一个时间复杂度为 $\mathcal{O}\left(\left(T+\sqrt N\right)\omega\right)$ 的做法。

    信息

    ID
    435
    时间
    1000ms
    内存
    64MiB
    难度
    10
    标签
    递交数
    3
    已通过
    0
    上传者