解题报告 (八) 矩阵快速幂【进阶】

一、矩阵快速幂 算法讲解

夜深人静写算法(二十)矩阵快速幂

二、矩阵快速幂 解题报告

HDU 3658 How many words
  • 链接:HDU 3658 How many words
  • 题意:一个字符串只能包含大小写字母,必须满足两条规则:
    1)任意两个相邻字符的 A S C I I ASCII ASCII 码差值必须小于等于 32 32 32
    2)至少一对相邻字符的 A S C I I ASCII ASCII 码 差值正好等于 32 32 32
  • 给定长度 m ( 2 < = m < = 1 0 9 ) m (2 <= m <= 10^9) m(2<=m<=109),问总共有多少不同字符;
  • 难度:★★★☆☆
  • 题解:用 X 表示任意相邻字符差值小于等于 32 的数量;Y表示任意相邻字符差值小于32的数量,Z表示任意相邻字符差值不等于32的数量;因为条件 1,我们必须取集合 X ;因为条件 2,我们必须取集合 Z 的非,所以画出如下图:
  • X是小于 或 等于,Z是小于或大于,所以他们的交 Y 就是小于了,最后的答案就是 X - Y;
    在这里插入图片描述
  • 建立邻接矩阵,矩阵的行代表前一个字符,列代表当前字符,如果行列字符的 ASCII 码 差值小于等于 32,则为1,否则为0;
  • 建立二分矩阵计算 X, 然后用同样方法二分计算 Y,相减就是答案;
HDU 6030 Happy Necklace

链接:HDU 6030 Happy Necklace
题意:一个字符串由蓝色字符 (A表示) 和红色字符 (a表示) 组成,要求任意素数长度的子串中蓝色字符不能少于红色字符,给定字符串长度 n < = 1 0 18 n <= 10^{18} n<=1018,求方案数 % ( 1 0 9 + 7 ) \% (10^9 + 7) %(109+7)
难度:★★★☆☆
题解:

  • 1)考虑如果一个字符串以a结尾,那么后面只能跟A,因为2是素数,不能出现aa,所以有状态转移如下:
a
aA
  • 2)如果一个字符串以 aA 结尾,那么后面只能跟 A,因为 3是素数,不能出现 aAa,所以有状态转移如下:
aA
aAA
  • 3)如果一个字符串以 aAA 结尾,那么后面可以跟 a,也可以跟 A,原因是以 aAA 结尾的字符串要么就是 aAA 要么一定也是以AaAA 结尾的(因为不可能出现 aaAA),所以有状态转移;
aAA
aAAA
a
  • 4)最后来看 aAAA 和 AAA 的状态其实是一样的,所以可以进行状态合并,并且可以得出 AAA 的状态转移如下:
AAA
a
  • 5)最后将所有状态组合在一个图上,得到一个状态转移图如下:
a
aA
aAA
AAA
  • 6)用数字对几个状态进行编号,得到状态转移矩阵如下:
    A = [ 0 1 0 0 0 0 1 0 1 0 0 1 1 0 0 1 ] A = \left[ \begin{matrix} 0 & 1 & 0 & 0\\ 0 & 0 & 1 & 0\\ 1 & 0 & 0 & 1\\1 & 0 & 0 &1\end{matrix} \right] A=0011100001000011
  • 长度为 n n n 的方案数为 A n + 2 A^{n+2} An+2 第一行的和;
HDU 1588 Gauss Fibonacci
  • 链接:HDU 1588 Gauss Fibonacci

  • 题意:

  • 1) f ( 0 ) = 0 ; f ( 1 ) = 1 ; f ( n ) = f ( n − 1 ) + f ( n − 2 ) ( n > = 2 ) f(0)=0; f(1)=1;f(n)=f(n-1)+f(n-2) (n>=2) f(0)=0;f(1)=1;f(n)=f(n1)+f(n2)(n>=2)

  • 2) g ( i ) = k ∗ i + b g(i)=k*i+b g(i)=ki+b

  • 3)给定 k , b , n , M ( 0 < = k , b , n < 1 0 9 ) k,b,n,M(0<= k,b,n<10^9) k,b,n,M(0<=k,b,n<109),求 ∑ i n − 1 f ( g ( i ) ) % M \sum_i^{n-1}{f(g(i))} \% M in1f(g(i))%M

  • 难度:★★★☆☆

  • 题解:一维递推类问题,构造系数矩阵如下:

  • 我们知道斐波那契数列的系数矩阵如下:
    [ f ( n ) f ( n − 1 ) ] = [ 1 1 1 0 ] [ f ( n − 1 ) f ( n − 2 ) ] = [ 1 1 1 0 ] n − 1 [ f ( 1 ) f ( 0 ) ] = A n − 1 [ 1 0 ] \begin{aligned} \left[ \begin{matrix} f(n) \\ f(n-1) \end{matrix}\right] &= \left[ \begin{matrix} 1 & 1\\ 1 & 0\end{matrix}\right] \left[ \begin{matrix} f(n-1) \\ f(n-2)\end{matrix}\right] \\&= \left[ \begin{matrix} 1 & 1\\ 1 & 0\end{matrix}\right]^{n-1} \left[ \begin{matrix} f(1) \\ f(0)\end{matrix}\right] \\&= A^{n-1} \left[ \begin{matrix} 1 \\ 0\end{matrix}\right] \end{aligned} [f(n)f(n1)]=[1110][f(n1)f(n2)]=[1110]n1[f(1)f(0)]=An1[10]

  • 所以求 f ( g ( i ) ) = f ( k ∗ i + b ) f(g(i)) = f(k*i+b) f(g(i))=f(ki+b),就是求 A k ∗ i + b − 1 A^{k*i+b-1} Aki+b1,那么求和 ∑ i = 0 n − 1 f ( g ( i ) ) \sum_{i=0}^{n-1}{f(g(i))} i=0n1f(g(i)) 就是求
    T = A b − 1 + A k + b − 1 + A 2 k + b − 1 + . . . + A ( n − 1 ) k + b − 1 = A b − 1 ∗ ( A 0 + A k + A 2 k + . . . + A ( n − 1 ) k ) \begin{aligned} T = &A^{b-1} + A^{k+b-1} + A^{2k+b-1} + ... + A^{(n-1)k+b-1} \\ &= A^{b-1} * ( A^0 + A^k + A^{2k} + ... + A^{(n-1)k} ) \end{aligned} T=Ab1+Ak+b1+A2k+b1+...+A(n1)k+b1=Ab1(A0+Ak+A2k+...+A(n1)k)
    S ( n k ) = A k + A 2 k + . . . + A n k S(nk) = A^k + A^{2k} + ... + A^{nk} S(nk)=Ak+A2k+...+Ank,则可以构造求和矩阵如下:
    [ S ( n k ) I ] = [ A k A k O I ] [ S ( ( n − 1 ) k ) I ] = [ A k A k O I ] n − 1 [ S ( k ) I ] = S n − 1 [ A k I ] \begin{aligned} \left[ \begin{matrix} S(nk) \\ I \end{matrix}\right] &= \left[ \begin{matrix} A^k & A^k\\O & I\\ \end{matrix}\right] \left[ \begin{matrix} S((n-1)k) \\ I \\ \end{matrix}\right] \\ &= \left[ \begin{matrix} A^k & A^k\\O & I\\ \end{matrix}\right]^{n-1} \left[ \begin{matrix} S(k) \\ I \\ \end{matrix}\right] \\ &= {S}^{n-1} \left[ \begin{matrix} A^k \\ I \\ \end{matrix}\right] \end{aligned} [S(nk)I]=[AkOAkI][S((n1)k)I]=[AkOAkI]n1[S(k)I]=Sn1[AkI]

  • 所以,依次求出 A k A^k Ak S S S S n − 2 S^{n-2} Sn2 S ( ( n − 1 ) k ) S((n-1)k) S((n1)k) A b − 1 A^{b-1} Ab1 T T T f ( g ( i ) ) f(g(i)) f(g(i))

  • 注意,这题的特殊判断比较多,比如 n = 0 、 1 、 2 ; b = 0 ; n = 0、1、2;b = 0; n=012b=0 等情况都需要进行特殊处理;

HDU 3936 FIB Query
  • 链接:HDU 3936 FIB Query

  • 题意:

  • 1) f ( 0 ) = 0 ; f ( 1 ) = 1 ; f ( n ) = f ( n − 1 ) + f ( n − 2 ) ( n > = 2 ) f(0)=0; f(1)=1;f(n)=f(n-1)+f(n-2) (n>=2) f(0)=0;f(1)=1;f(n)=f(n1)+f(n2)(n>=2)

  • 2) g ( i ) = 4 ∗ i − 1 g(i)=4*i-1 g(i)=4i1

  • 3)给定 L , R ( 1 < = L , R < 1 0 12 ) L, R(1<= L, R<10^{12}) L,R(1<=L,R<1012),求 ∑ L R f ( g ( i ) ) % 1000000007 \sum_L^{R}{f(g(i))} \% 1000000007 LRf(g(i))%1000000007

  • 难度:★★★☆☆

  • 题解:首先,部分和可以转化成求前缀和,如下:
    ∑ L R f ( g ( i ) ) % 1000000007 = ( ∑ 1 R f ( g ( i ) ) − ∑ 1 L − 1 f ( g ( i ) ) ) % 1000000007 \sum_{L}^{R}{f(g(i))} \% 1000000007 = (\sum_1^{R}{f(g(i))} - \sum_1^{L-1}{f(g(i))})\% 1000000007 LRf(g(i))%1000000007=(1Rf(g(i))1L1f(g(i)))%1000000007

  • 问题转化成求 ∑ i = 1 n f ( g ( i ) ) % 1000000007 \sum_{i=1}^{n}{f(g(i))} \% 1000000007 i=1nf(g(i))%1000000007

  • 一维递推类问题,构造系数矩阵如下:

  • 我们知道斐波那契数列的系数矩阵如下:
    [ f ( n ) f ( n − 1 ) ] = [ 1 1 1 0 ] [ f ( n − 1 ) f ( n − 2 ) ] = [ 1 1 1 0 ] n − 1 [ f ( 1 ) f ( 0 ) ] = A n − 1 [ 1 0 ] \begin{aligned} \left[ \begin{matrix} f(n) \\ f(n-1) \end{matrix}\right] &= \left[ \begin{matrix} 1 & 1\\ 1 & 0\end{matrix}\right] \left[ \begin{matrix} f(n-1) \\ f(n-2)\end{matrix}\right] \\&= \left[ \begin{matrix} 1 & 1\\ 1 & 0\end{matrix}\right]^{n-1} \left[ \begin{matrix} f(1) \\ f(0)\end{matrix}\right] \\&= A^{n-1} \left[ \begin{matrix} 1 \\ 0\end{matrix}\right] \end{aligned} [f(n)f(n1)]=[1110][f(n1)f(n2)]=[1110]n1[f(1)f(0)]=An1[10]

  • 所以求 f ( g ( i ) ) = f ( 4 ∗ i − 1 ) f(g(i)) = f(4*i-1) f(g(i))=f(4i1),就是求 A 4 ∗ i − 2 A^{4*i-2} A4i2,那么求和 ∑ i = 1 n f ( g ( i ) ) \sum_{i=1}^{n}{f(g(i))} i=1nf(g(i)) 就是求
    T = A 4 ∗ 1 − 2 + A 4 ∗ 2 − 2 + A 4 ∗ 3 − 2 + . . . + A 4 ∗ n − 2 = A 2 ∗ ( A 4 ∗ 0 + A 4 ∗ 1 + A 4 ∗ 2 + . . . + A 4 ∗ ( n − 1 ) ) \begin{aligned} T &= A^{4*1-2} + A^{4*2-2} + A^{4*3-2} + ... + A^{4*n-2} \\ &= A^{2} * ( A^{4*0} + A^{4*1} + A^{4*2} + ... + A^{4*(n-1)} ) \end{aligned} T=A412+A422+A432+...+A4n2=A2(A40+A41+A42+...+A4(n1))
    S ( n k ) = A k + A 2 k + . . . + A n k S(nk) = A^k + A^{2k} + ... + A^{nk} S(nk)=Ak+A2k+...+Ank,则可以构造求和矩阵如下:
    [ S ( n k ) I ] = [ A k A k O I ] [ S ( ( n − 1 ) k ) I ] = [ A k A k O I ] n − 1 [ S ( k ) I ] = S n − 1 [ A k I ] \begin{aligned} \left[ \begin{matrix} S(nk) \\ I \end{matrix}\right] &= \left[ \begin{matrix} A^k & A^k\\O & I\\ \end{matrix}\right] \left[ \begin{matrix} S((n-1)k) \\ I \\ \end{matrix}\right] \\ &= \left[ \begin{matrix} A^k & A^k\\O & I\\ \end{matrix}\right]^{n-1} \left[ \begin{matrix} S(k) \\ I \\ \end{matrix}\right] \\ &= {S}^{n-1} \left[ \begin{matrix} A^k \\ I \\ \end{matrix}\right] \end{aligned} [S(nk)I]=[AkOAkI][S((n1)k)I]=[AkOAkI]n1[S(k)I]=Sn1[AkI]

  • 所以,依次求出 A 4 A^4 A4 S S S S n − 2 S^{n-2} Sn2 S ( ( n − 1 ) k ) S((n-1)k) S((n1)k) A 2 A^{2} A2 T T T f ( g ( i ) ) f(g(i)) f(g(i))

  • 注意,这题的特殊判断比较多,比如 n = 0 、 1 、 2 ; b = 0 ; n = 0、1、2;b = 0; n=012b=0 等情况都需要进行特殊处理;

HDU 2254 奥运
  • 链接:HDU 2254 奥运
  • 题意:给定一个有向图,最多30个点,求v1到v2在第t1到t2天的方案数 (0<=t1, t2<10000);
  • 难度:★★★☆☆
  • 题解:令 f ( n , v ) f(n, v) f(n,v) 为从任意点出发,经过 n 步以后到达 v 的方案数,那么有状态转移如下:
    f ( n , v ) = ∑ u − > v f ( n − 1 , u ) f(n,v) = \sum_{}^{u->v}f(n-1,u) f(n,v)=u>vf(n1,u)
  • 举个例子,有向图如下:
0
1
2
  • 这个图的邻接矩阵如下( A [ u ] [ v ] 表 示 u 到 v 有 多 少 条 边 A[u][v] 表示 u 到 v 有多少条边 A[u][v]uv):
    A = [ 0 1 1 1 0 0 0 0 0 ] A = \left[ \begin{matrix} 0 & 1 & 1\\ 1 & 0 & 0 \\ 0 & 0 & 0 \end{matrix} \right] A=010100100
  • 根据状态转移构造出如下矩阵递推关系:
    [ f ( n , 0 ) f ( n , 1 ) f ( n , 2 ) ] = [ 0 1 0 1 0 0 1 0 0 ] [ f ( n − 1 , 0 ) f ( n − 1 , 1 ) f ( n − 1 , 2 ) ] \left[ \begin{matrix} f(n,0)\\ f(n,1) \\ f(n,2) \end{matrix} \right] = \left[ \begin{matrix} 0 & 1 & 0\\ 1 & 0 & 0 \\ 1 & 0 & 0 \end{matrix} \right] \left[ \begin{matrix} f(n-1,0)\\ f(n-1,1) \\ f(n-1,2) \end{matrix} \right]\\ f(n,0)f(n,1)f(n,2)=011100000f(n1,0)f(n1,1)f(n1,2)
  • 观察发现 系数矩阵 和 正好是 邻接矩阵 的 转置,于是根据邻接矩阵建立反图;令系数矩阵为A,顶点数为 m,从 v 1 点 到 v 2 v_1 点到 v_2 v1v2 点经过 n n n 天的方案数,可以构造出如下等式:
    [ f ( n , 0 ) f ( n , 1 ) . . . f ( n , v 2 ) . . . f ( n , m − 1 ) ] = A n − 1 [ f ( 1 , 0 ) f ( 1 , 1 ) . . . f ( 1 , v 1 ) . . . f ( 1 , m − 1 ) ] \left[ \begin{matrix} f(n,0)\\ f(n,1) \\ ... \\ f(n,v_2) \\... \\ f(n,m-1) \end{matrix} \right] = A^{n-1} \left[ \begin{matrix} f(1,0)\\ f(1,1) \\ ... \\ f(1,v_1) \\... \\ f(1,m-1) \end{matrix} \right]\\ f(n,0)f(n,1)...f(n,v2)...f(n,m1)=An1f(1,0)f(1,1)...f(1,v1)...f(1,m1)
  • 其中 f ( 1 , x ) = { 0 x < > v 1 1 x = v 1 f(1,x)=\begin{cases}0 & x <> v_1\\1 & x = v_1\end{cases} f(1,x)={01x<>v1x=v1
  • 这题求的是 t 1 t_1 t1 t 2 t_2 t2 天的方案数总和,所以需要求 A t 1 + A t 1 + 1 + . . . + A t 2 A^{t_1} + A^{t_1+1} + ... + A^{t_2} At1+At1+1+...+At2
  • S ( n ) = A 1 + A 2 + . . . + A n S(n)=A^1 + A^2 + ... + A^n S(n)=A1+A2+...+An,我们要求的就是 S ( t 2 ) − S ( t 1 − 1 ) S(t_2) - S(t_1-1) S(t2)S(t11);于是问题转换成求矩阵 n 次幂的前缀和;
  • 构造一个阶数是 A 的两倍的 矩阵 A ′ A' A,且满足如下:
    [ S ( n ) I ] = [ A A O I ] [ S ( n − 1 ) I ] = [ A A O I ] n [ O I ] = A ′ n [ O I ] \begin{aligned} \left[ \begin{matrix} S(n)\\ I \end{matrix} \right] &= \left[ \begin{matrix} A & A \\ O & I \end{matrix} \right] \left[ \begin{matrix} S(n-1) \\ I \end{matrix} \right] \\&= \left[ \begin{matrix} A & A \\ O & I \end{matrix} \right]^{n} \left[ \begin{matrix} O \\ I \end{matrix} \right]\\&= {A'}^{n} \left[ \begin{matrix} O \\ I \end{matrix} \right]\\ \end{aligned} [S(n)I]=[AOAI][S(n1)I]=[AOAI]n[OI]=An[OI]
  • 于是问题转化成求 矩阵 A ′ A' A 的 n 次幂;
HDU 5607 graph
  • 链接:HDU 5607 graph
  • 题意:给定一张有向图,从任意点出发的概率都是均等的,问从起点 u 到 所有点 经过 K 步的概率;因为输出的概率是个小数,所以如果答案是 X Y \frac{X}{Y} YX,则需要输出 X × Y 1 0 9 + 5 m o d    1 0 9 + 7 X \times Y^{10^9+5} \mod {10^9+7} X×Y109+5mod109+7.
  • 难度:★★★☆☆
  • 题解:直接举例更加直观;对于如下的有向图:
1
2
3
  • 建立矩阵如下:
    A = [ 0 1 3 0 1 2 1 3 1 1 2 1 3 0 ] \begin{aligned} A = \left[ \begin{matrix} 0 & \frac{1}{3} & 0 \\ \frac{1}{2} & \frac{1}{3} & 1 \\ \frac{1}{2} & \frac{1}{3} & 0 \end{matrix} \right] \end{aligned} A=02121313131010
  • 其中 A [ i ] [ j ] A[i][j] A[i][j]表示的是 j j j i i i 的概率,所以如果 j j j i i i 有边,那么令 j j j 的出度为 D D D A [ i ] [ j ] = 1 D A[i][j] = \frac{1}{D} A[i][j]=D1;且 A A A 这个矩阵的每一列的和恒为1;
  • 由于这个矩阵存在小数,可以用 D D D 1 0 9 + 7 10^9+7 109+7 求逆元化成整数,得到新的矩阵如下:
    A = [ 0 333333336 0 500000004 333333336 1 500000004 333333336 0 ] \begin{aligned} A = \left[ \begin{matrix} 0 & 333333336 & 0 \\ 500000004 & 333333336 & 1 \\ 500000004 & 333333336 & 0 \end{matrix} \right] \end{aligned} A=0500000004500000004333333336333333336333333336010
  • 最后 X X X 代表 u u u 到某个点的概率值, Y Y Y 代表 u u u 到所有点的概率值,利用矩阵二分求解后按照题意中的进行二分幂即可;
HDU 3292 No more tricks, Mr Nanguo
  • 链接:HDU 3292 No more tricks, Mr Nanguo
  • 题意:等于等式 X 2 = N × Y 2 + 1 ( X , Y > 0 ) X^2 = N \times Y^2 + 1 (X,Y>0) X2=N×Y2+1XY>0,给定 N ( N < = 29 ) 、 K N(N <= 29)、K N(N<=29)K,求第 K K K 大的 X X X 的值;
  • 难度:★★★☆☆
  • 题解:首先,当 N N N 为完全平方数的时候,则无解;否则,利用枚举得到最小的解 X 1 , Y 1 X_1, Y_1 X1,Y1,则有如下等式成立:
    X k + N Y k = ( X 1 + N Y 1 ) k X_k + \sqrt N Y_k = (X_1 + \sqrt N Y_1)^k Xk+N Yk=(X1+N Y1)k,转化成递推的形式如下:
    X k + N Y k = ( X k − 1 + N Y k − 1 ) ( X 1 + N Y 1 ) = ( X 1 X k − 1 + N Y 1 Y k − 1 ) + N ( X 1 Y k − 1 + Y 1 X k − 1 ) \begin{aligned} X_k + \sqrt N Y_k &= (X_{k-1} + \sqrt N Y_{k-1})(X_1 + \sqrt N Y_1) \\ &= (X_1 X_{k-1} + NY_1Y_{k-1}) +\sqrt N (X_1Y_{k-1} + Y_1X_{k-1}) \end{aligned} Xk+N Yk=(Xk1+N Yk1)(X1+N Y1)=(X1Xk1+NY1Yk1)+N (X1Yk1+Y1Xk1)
  • 得到递推矩阵如下:
    [ X k Y k ] = [ X 1 N Y 1 Y 1 X 1 ] [ X k − 1 Y k − 1 ] = A k − 1 [ X 1 Y 1 ] \begin{aligned} \left[ \begin{matrix} X_k \\ Y_k \end{matrix}\right] &= \left[ \begin{matrix} X_1 & NY_1 \\ Y_1 & X_1 \end{matrix}\right] \left[ \begin{matrix} X_{k-1} \\ Y_{k-1} \end{matrix}\right] \\ &= A^{k-1}\left[ \begin{matrix} X_1 \\ Y_1 \end{matrix}\right] \end{aligned} [XkYk]=[X1Y1NY1X1][Xk1Yk1]=Ak1[X1Y1]
  • 矩阵二分求解 A 即可;
HDU 2256 Problem of Precision
  • 链接:HDU 2256 Problem of Precision
  • 题意:求 ⌊ ( 2 + 3 ) n ⌋ m o d    1024 \lfloor (\sqrt 2 + \sqrt 3)^{n} \rfloor \mod 1024 (2 +3 )nmod1024
  • 难度:★★★☆☆
  • 题解:首先令 f ( n ) = ( 2 + 3 ) 2 n = ( 5 + 2 6 ) n f(n) = {(\sqrt{2}+\sqrt{3})}^{2n} = (5+2\sqrt{6})^n f(n)=(2 +3 )2n=(5+26 )n,无论 n 多大,一定可以表示成 f ( n ) = A n + B n 6 f(n) = A_n + B_n\sqrt{6} f(n)=An+Bn6 ,则有如下递推式:
    f ( n ) = A n + B n 6 = ( A n − 1 + B n − 1 6 ) ( 5 + 2 6 ) = ( 5 A n − 1 + 12 B n − 1 ) + ( 2 A n − 1 + 5 B n − 1 ) 6 \begin{aligned} f(n) &= A_n + B_n\sqrt{6} \\ &= (A_{n-1} + B_{n-1}\sqrt{6})(5+2\sqrt{6})\\ &= (5A_{n-1} + 12B_{n-1}) + (2A_{n-1} + 5B_{n-1})\sqrt{6} \end{aligned} f(n)=An+Bn6 =(An1+Bn16 )(5+26 )=(5An1+12Bn1)+(2An1+5Bn1)6
  • 表示成矩阵的形式如下:
    [ A n B n ] = [ 5 12 2 5 ] [ A n − 1 B n − 1 ] = [ 5 12 2 5 ] n − 1 [ 5 2 ] \left[ \begin{matrix} A_n \\B_n\end{matrix} \right]= \left[ \begin{matrix} 5 & 12\\ 2 & 5\end{matrix} \right] \left[ \begin{matrix} A_{n-1} \\B_{n-1} \end{matrix} \right]= \left[ \begin{matrix} 5 & 12\\ 2 & 5\end{matrix} \right]^{n-1} \left[ \begin{matrix} 5 \\2 \end{matrix} \right] [AnBn]=[52125][An1Bn1]=[52125]n1[52]
    又由于 ( 5 + 2 6 ) ( 5 − 2 6 ) = 1 (5+2\sqrt{6})(5-2\sqrt{6})=1 (5+26 )(526 )=1,得到 ( 5 + 2 6 ) n ( 5 − 2 6 ) n = 1 (5+2\sqrt{6})^n(5-2\sqrt{6})^n=1 (5+26 )n(526 )n=1,则 ( A n + B n 6 ) ( A n − B n 6 ) = 1 (A_n+B_n\sqrt{6})(A_n-B_n\sqrt{6})=1 (An+Bn6 )(AnBn6 )=1,得到:
    6 B n 2 = A n 2 − 1 6B_n^2 = A_n^2 - 1 6Bn2=An21,从而推导出 B n 6 = A n 2 − 1 B_n\sqrt{6} = \sqrt{A_n^2 - 1} Bn6 =An21 ,于是 B n 6 B_n\sqrt{6} Bn6 的整数部分就是 A n − 1 A_n-1 An1,所以我们要求的答案就是 ( 2 A n − 1 ) % 1024 (2A_n-1) \% 1024 (2An1)%1024,矩阵求解 A n A_n An
HDU 4549 M斐波那契数列

链接:HDU 4549 M斐波那契数列
题意: F ( 0 ) = a , F ( 1 ) = b , F ( n ) = F ( n − 1 ) ∗ F ( n − 2 ) ( n > 1 ) F(0) = a, F(1) = b, F(n) = F(n-1) * F(n-2) ( n > 1 ) F(0)=a,F(1)=b,F(n)=F(n1)F(n2)(n>1)

  • 给定 a 、 b 、 n ( n < = 1 0 9 ) a、b、n(n <=10^9) abn(n<=109),求 F ( n ) m o d    1000000007 F(n) \mod 1000000007 F(n)mod1000000007

  • 难度:★★★☆☆

  • 题解:扩展欧拉定理 + 矩阵二分

  • 根据递推公式容易得到 F ( n ) = a f ( n − 2 ) b f ( n − 1 ) F(n) = a^{f(n-2)}b^{f(n-1)} F(n)=af(n2)bf(n1),其中 f ( 0 ) = f ( 1 ) = 1 f(0)=f(1)=1 f(0)=f(1)=1,且满足 f ( n ) = f ( n − 1 ) + f ( n − 2 ) f(n) = f(n-1) + f(n-2) f(n)=f(n1)+f(n2),即斐波那契数列;

  • G ( n , k ) = k f ( n ) m o d    1000000007 G(n, k) = k^{f(n)} \mod1000000007 G(n,k)=kf(n)mod1000000007,那么我们只需要求出 G ( n , k ) G(n, k) G(n,k) 就可以求得原式的解;

  • 扩展欧拉定理
    a b m o d    c = { a b m o d    φ ( c ) m o d    c g c d ( a , c ) = 1 a b m o d    c g c d ( a , c ) ≠ 1 , b < φ ( c ) a b m o d    φ ( c ) + φ ( c ) m o d    c g c d ( a , c ) ≠ 1 , b > = φ ( c ) a^{b} \mod c = \begin {cases} a^{b \mod \varphi(c)} \mod c & { gcd(a,c)=1} \\ a^{b} \mod c & { gcd(a,c) \neq 1 ,b < \varphi(c)} \\ a^{b \mod \varphi(c) + \varphi(c)} \mod c & { gcd(a,c) \neq 1 ,b >= \varphi(c)} \\ \end {cases} abmodc=abmodφ(c)modcabmodcabmodφ(c)+φ(c)modcgcd(a,c)=1gcd(a,c)=1b<φ(c)gcd(a,c)=1b>=φ(c)

  • f ( n ) < φ ( 1000000007 ) f(n) < \varphi(1000000007) f(n)<φ(1000000007) 说明 n 比较小,直接求递推求出来即可;

  • f ( n ) > = φ ( 1000000007 ) f(n) >= \varphi(1000000007) f(n)>=φ(1000000007) 时,根据扩展欧拉定理,得到:
    G ( n , k ) = k f ( n ) m o d    1000000007 = k f ( n ) m o d    φ ( 1000000007 ) + φ ( 1000000007 ) m o d    1000000007 \begin{aligned} G(n, k) &= k^{f(n)} \mod1000000007 \\ &= k^{f(n) \mod \varphi(1000000007) + \varphi(1000000007)} \mod1000000007 \end{aligned} G(n,k)=kf(n)mod1000000007=kf(n)modφ(1000000007)+φ(1000000007)mod1000000007

  • f ( n ) f(n) f(n) 是最基本的斐波那契数列,直接用矩阵二分求解即可;

HDU 5895 Mathematician QSC
  • 链接:HDU 5895 Mathematician QSC
  • 题意:已知公式: f ( n ) = { 0 ( n = = 0 ) 1 ( n = = 1 ) 2 ∗ f ( n − 1 ) + f ( n − 2 ) ( n > = 2 ) f(n) = \begin{cases} 0 & (n == 0) \\ 1 & (n == 1) \\ 2*f(n-1) + f(n-2) & (n >= 2) \end{cases} f(n)=012f(n1)+f(n2)(n==0)(n==1)(n>=2)

g ( n ) = ∑ i = 0 n f ( i ) 2 g(n) = \sum_{i=0}^{n}f(i)^2 g(n)=i=0nf(i)2
给出 n 、 y 、 x 、 s n、y、x、s nyxs 求:
x g ( n ∗ y ) % ( s + 1 ) x^{g(n*y)} \% (s+1) xg(ny)%(s+1)

  • 难度:★★★☆☆
  • 题解:扩展欧拉定理 + 矩阵二分
  • f(n) 的矩阵比较容易构造,如下:
    [ f ( n ) f ( n − 1 ) ] = [ 2 1 1 0 ] [ f ( n − 1 ) f ( n − 2 ) ] \left[ \begin{matrix} f(n)\\ f(n-1) \end{matrix} \right] = \left[ \begin{matrix} 2 & 1\\ 1 & 0 \end{matrix} \right] \left[ \begin{matrix} f(n-1)\\ f(n-2) \end{matrix} \right]\\ [f(n)f(n1)]=[2110][f(n1)f(n2)]
    那么如何构造 f ( n ) 2 f(n)^2 f(n)2 呢?我们尝试将原式带入,得到:
    f ( n ) 2 = 4 f ( n − 1 ) 2 + 4 f ( n − 1 ) f ( n − 2 ) + f ( n − 2 ) 2 f(n)^2 = 4f(n-1)^2 + 4f(n-1)f(n-2) + f(n-2)^2 f(n)2=4f(n1)2+4f(n1)f(n2)+f(n2)2,所以递推式里面需要引入当前项前一项的乘积;矩阵构造的时候,列向量应该是:
    [ f ( n ) 2 f ( n ) f ( n − 1 ) f ( n − 1 ) 2 ] \left[ \begin{matrix} f(n)^2\\ f(n)f(n-1)\\f(n-1)^2 \end{matrix} \right] f(n)2f(n)f(n1)f(n1)2
    进行递推矩阵的构造,得到如下矩阵:
    [ f ( n ) 2 f ( n ) f ( n − 1 ) f ( n − 1 ) 2 ] = [ 4 4 1 2 1 0 1 0 0 ] [ f ( n − 1 ) 2 f ( n − 1 ) f ( n − 2 ) f ( n − 2 ) 2 ] \left[ \begin{matrix} f(n)^2\\ f(n)f(n-1)\\f(n-1)^2 \end{matrix} \right]= \left[ \begin{matrix} 4 & 4 &1\\ 2 & 1 & 0\\1 & 0 & 0 \end{matrix} \right] \left[ \begin{matrix} f(n-1)^2\\ f(n-1)f(n-2)\\f(n-2)^2 \end{matrix} \right] f(n)2f(n)f(n1)f(n1)2=421410100f(n1)2f(n1)f(n2)f(n2)2
    然而,这里又要求是求和,所以需要引用一个求和项,即
    [ s u m ( n ) f ( n ) 2 f ( n ) f ( n − 1 ) f ( n − 1 ) 2 ] \left[ \begin{matrix} sum(n) \\f(n)^2\\ f(n)f(n-1)\\f(n-1)^2 \end{matrix} \right] sum(n)f(n)2f(n)f(n1)f(n1)2
    整理后,得到最终的递推矩阵为:
    [ s u m ( n ) f ( n ) 2 f ( n ) f ( n − 1 ) f ( n − 1 ) 2 ] = [ 1 4 4 1 0 4 4 1 0 2 1 0 0 1 0 0 ] [ s u m ( n − 1 ) f ( n − 1 ) 2 f ( n − 1 ) f ( n − 2 ) f ( n − 2 ) 2 ] \left[ \begin{matrix} sum(n) \\f(n)^2\\ f(n)f(n-1)\\f(n-1)^2 \end{matrix} \right]= \left[ \begin{matrix} 1 & 4 & 4 &1\\ 0 & 4 & 4 & 1\\0 & 2 & 1 & 0\\0 & 1 & 0 &0\end{matrix} \right] \left[ \begin{matrix} sum(n-1) \\f(n-1)^2\\ f(n-1)f(n-2)\\f(n-2)^2 \end{matrix} \right] sum(n)f(n)2f(n)f(n1)f(n1)2=1000442144101100sum(n1)f(n1)2f(n1)f(n2)f(n2)2
    即:
    [ s u m ( n ) f ( n ) 2 f ( n ) f ( n − 1 ) f ( n − 1 ) 2 ] = [ 1 4 4 1 0 4 4 1 0 2 1 0 0 1 0 0 ] n − 1 [ 1 1 0 0 ] \left[ \begin{matrix} sum(n) \\f(n)^2\\ f(n)f(n-1)\\f(n-1)^2 \end{matrix} \right]= \left[ \begin{matrix} 1 & 4 & 4 &1\\ 0 & 4 & 4 & 1\\0 & 2 & 1 & 0\\0 & 1 & 0 &0\end{matrix} \right]^{n-1} \left[ \begin{matrix} 1 \\1\\ 0\\0 \end{matrix} \right] sum(n)f(n)2f(n)f(n1)f(n1)2=1000442144101100n11100
    根据扩展欧拉定理,有
    a b m o d    c = { a b m o d    φ ( c ) m o d    c g c d ( a , c ) = 1 a b m o d    c g c d ( a , c ) ≠ 1 , b < φ ( c ) a b m o d    φ ( c ) + φ ( c ) m o d    c g c d ( a , c ) ≠ 1 , b > = φ ( c ) a^{b} \mod c = \begin {cases} a^{b \mod \varphi(c)} \mod c & { gcd(a,c)=1} \\ a^{b} \mod c & { gcd(a,c) \neq 1 ,b < \varphi(c)} \\ a^{b \mod \varphi(c) + \varphi(c)} \mod c & { gcd(a,c) \neq 1 ,b >= \varphi(c)} \\ \end {cases} abmodc=abmodφ(c)modcabmodcabmodφ(c)+φ(c)modcgcd(a,c)=1gcd(a,c)=1b<φ(c)gcd(a,c)=1b>=φ(c)
    然后直接套公式,矩阵二分求解;
HDU 2238 机器人的舞蹈II
  • 链接:HDU 2238 机器人的舞蹈II

  • 题意:一天四个相同的机器人在一张跳舞毯上跳舞,这是一张特殊的跳舞毯,他由4个正方形毯子组成一个大的正方形毯子,一开始四个机器人分别站在4块毯子上,舞蹈的每一步机器人可以往临近(两个毯子拥有同一条边视为临近)的一个毯子移动或停留在原来的毯子(同一块毯子可以有多个机器人停留),这个时候机器人的制造者你想知道经过n步的移动有多少种方式可以让每个毯子上都有机器人停留。
    在这里插入图片描述

  • 难度:★★★☆☆

  • 题解:矩阵 + DFS

  • 比较直观的理解就是每个机器人在每一步都有四个毯子选择,机器人一共有四个,所以任意情况总共有 4 4 4^4 44 种状态,用一个五维数组表示状态,第一维表示经过到哪一步,后面四维分别代表每个机器人在那个步数下处于哪个毯子上;
    d p [ s t e p ] [ s 0 ] [ s 1 ] [ s 2 ] [ s 3 ] ( 其 中 0 < s 0 , s 1 , s 2 , s 3 < 4 ) dp[step][s_0][s_1][s_2][s_3] (其中 0 < s_0,s_1,s_2,s_3< 4) dp[step][s0][s1][s2][s3](0<s0,s1,s2,s3<4),列出状态转移方程,如下:
    d p [ s t e p ] [ s 0 ] [ s 1 ] [ s 2 ] [ s 3 ] = ∑ d p [ s t e p − 1 ] [ p 0 ] [ p 1 ] [ p 2 ] [ p 3 ] ( p i 和 s i 相 邻 ) dp[step][s_0][s_1][s_2][s_3] = \sum{dp[step-1][p_0][p_1][p_2][p_3] ( p_i和s_i相邻 )} dp[step][s0][s1][s2][s3]=dp[step1][p0][p1][p2][p3]pisi
    将后面四维状态编码到 0 - 255 的整数中,就可以列出一个 256 × 256 256 \times 256 256×256 的矩阵, 但是这样计算的话,时间复杂度是 O ( l o g ( n ) N 3 ) O( log(n) N^3) O(log(n)N3),所以需要做状态压缩;由于每个机器人都是一样的,所以这里其实有很多状态是可以合并的,考虑:
    1)将 每个机器人在哪个毯子上 的状态表示改成 每个毯子上有几个机器人
    2)只有当四个数字加起来等于 4 的才是合法状态,状态数压缩了一大半,最后只有 35 个状态;
    3)对所有状态进行编码,使之能够连续,方便把稀疏矩阵转为稠密矩阵;

  • 对每个状态枚举它能够到达的下一个状态,枚举方式采用深度优先搜索,比如当前状态为 [ 2 1 1 0 ] \left[ \begin{matrix} 2 & 1\\ 1 & 0 \end{matrix} \right] [2110]

  • 枚举每个机器人能够去的位置(三个),然后得到下一个状态,这里需要注意的是,因为每个机器人都是一样的,所以对于2个机器人的毯子,其实就是将它分拆成三个非负整数的方案,即:
    2 = 0 + 0 + 2 = 0 + 1 + 1 = 0 + 2 + 0 = 1 + 0 + 1 = 1 + 1 + 0 = 2 + 0 + 0 \begin{aligned}2 &= 0 + 0 + 2\\ &= 0 + 1 + 1\\ &= 0 + 2 + 0\\ &= 1 + 0 + 1\\ & = 1 + 1 + 0\\ & = 2 + 0 + 0 \end{aligned} 2=0+0+2=0+1+1=0+2+0=1+0+1=1+1+0=2+0+0

  • 通过深搜枚举出状态后构造状态转移矩阵,然后进行矩阵二分,再乘上一个 列向量B 就是答案, 列向量B 只有一个数字为 1(四个位置都是1的那个状态),其他均为0;

HDU 2855 Fibonacci Check-up
  • 链接:HDU 2855 Fibonacci Check-up
  • 题意: S ( n ) = ∑ k = 0 n C n k F ( k ) S(n) = \sum_{k=0}^{n}C_{n}^{k}F(k) S(n)=k=0nCnkF(k)其中 F ( k ) F(k) F(k) 为斐波那契数列: F ( 0 ) = 0 , F ( 1 ) = 1 F(0)=0, F(1)=1 F(0)=0,F(1)=1,给定 n 和 m,求 S ( n ) % m S(n) \% m S(n)%m 的值;
  • 难度:★★★★☆(推荐)
  • 题解:二项式定理 + 矩阵二分
  • 对于任意整数 x x x 满足二项式定理如下:
    ( 1 + x ) n = C n 0 + C n 1 x 1 + C n 2 x 2 + . . . C n n x n \begin{aligned} (1+x)^n = C_n^0 + C_n^1x^1 +C_n^2x^2 + ... C_n^nx^n \end{aligned} (1+x)n=Cn0+Cn1x1+Cn2x2+...Cnnxn
  • 将 x 看作是一个矩阵,这个定理依然成立,即:
    ( I + A ) n = C n 0 + C n 1 A 1 + C n 2 A 2 + . . . C n n A n \begin{aligned} (I+A)^n = C_n^0 + C_n^1A^1 +C_n^2A^2 + ... C_n^nA^n \end{aligned} (I+A)n=Cn0+Cn1A1+Cn2A2+...CnnAn
  • 其中 I I I 为单位矩阵,我们知道斐波那契数列的系数矩阵的为 [ 1 1 1 0 ] \begin{aligned} \left[ \begin{matrix} 1 & 1 \\ 1 & 0 \end{matrix}\right] \end{aligned} [1110],并且满足 [ 1 1 1 0 ] n = [ F ( n ) F ( n − 1 ) F ( n − 1 ) F ( n − 2 ) ] \begin{aligned} \left[ \begin{matrix} 1 & 1 \\ 1 & 0 \end{matrix}\right] \end{aligned}^n = \begin{aligned} \left[ \begin{matrix} F(n) & F(n-1) \\ F(n-1) & F(n-2) \end{matrix}\right] \end{aligned} [1110]n=[F(n)F(n1)F(n1)F(n2)]
  • A = [ 1 1 1 0 ] , I = [ 1 0 0 1 ] A = \begin{aligned} \left[ \begin{matrix} 1 & 1 \\ 1 & 0 \end{matrix}\right] \end{aligned},I = \begin{aligned} \left[ \begin{matrix} 1 & 0 \\ 0 & 1 \end{matrix}\right] \end{aligned} A=[1110]I=[1001],套入二项式定理,得到:
    ( I + A ) n = C n 0 + C n 1 A 1 + C n 2 A 2 + . . . C n n A n = [ 2 1 1 1 ] n = B n \begin{aligned} (I+A)^n &= C_n^0 + C_n^1A^1 +C_n^2A^2 + ... C_n^nA^n \\ &= \left[ \begin{matrix} 2 & 1 \\ 1 & 1 \end{matrix}\right]^n \\ &= B^n \end{aligned} (I+A)n=Cn0+Cn1A1+Cn2A2+...CnnAn=[2111]n=Bn
  • 这时我们发现, S ( n ) S(n) S(n) 就是 矩阵 B n B^n Bn 的 左上角那个元素, 矩阵二分求解矩阵 B 即可;
HDU 3509 Buge’s Fibonacci Number Problem
  • 链接:HDU 3509 Buge’s Fibonacci Number Problem
  • 题意: F ( 1 ) = f 1 , F ( 2 ) = f 2 , F ( n ) = a F ( n − 1 ) + b F ( n − 2 ) F(1) = f_1, F(2) = f_2, F(n) = aF(n-1) + bF(n-2) F(1)=f1,F(2)=f2,F(n)=aF(n1)+bF(n2)
  • 给定 f 1 、 f 2 、 a 、 b 、 n , m , k ( k < = 50 ) f_1、f_2、a、b、n,m,k(k <= 50) f1f2abnmk(k<=50),求 ∑ i = 1 n F ( i ) k m o d    m \sum_{i=1}^n F(i)^k \mod m i=1nF(i)kmodm
  • 难度:★★★★☆
  • 题解:递推公式k次幂的
  • G ( n , k ) = F ( n ) k G(n, k) = F(n)^k G(n,k)=F(n)k,则根据递推公式,对 G ( n , k ) G(n, k) G(n,k) 进行二项式展开,得到如下公式:
    G ( n , k ) = F ( n ) k = [ a F ( n − 1 ) + b F ( n − 2 ) ] k = C k 0 [ a F ( n − 1 ) ] k + C k 1 [ a F ( n − 1 ) ] k − 1 [ b F ( n − 2 ) ] + . . . + C k k [ a F ( n − 1 ) ] 0 [ b F ( n − 2 ) ] k = C k 0 a k G ( n − 1 , k ) + C k 1 a k − 1 b G ( n − 1 , k − 1 ) G ( n − 2 , 1 ) + . . . + C k k a 0 b k G ( n − 1 , 0 ) G ( n − 2 , k ) \begin{aligned} G(n, k) &= F(n)^k \\ &= [aF(n-1) + bF(n-2)]^k \\ &= C_k^0[aF(n-1)]^k + C_k^1[aF(n-1)]^{k-1}[bF(n-2)] + ... + C_k^k[aF(n-1)]^{0}[bF(n-2)]^k \\ &= C_k^0a^kG(n-1, k) + C_k^1a^{k-1}bG(n-1, k-1)G(n-2, 1) + ... + C_k^ka^0b^kG(n-1,0)G(n-2,k) \end{aligned} G(n,k)=F(n)k=[aF(n1)+bF(n2)]k=Ck0[aF(n1)]k+Ck1[aF(n1)]k1[bF(n2)]+...+Ckk[aF(n1)]0[bF(n2)]k=Ck0akG(n1,k)+Ck1ak1bG(n1,k1)G(n2,1)+...+Ckka0bkG(n1,0)G(n2,k)
  • 根据递推公式,列出所有涉及的列向量的值:

[ G ( n , k ) G ( n , k − 1 ) G ( n − 1 , 1 ) . . . G ( n , 1 ) G ( n − 1 , k − 1 ) G ( n , 0 ) G ( n − 1 , k ) ] \begin{aligned} \left[ \begin{matrix} G(n, k) \\ G(n, k-1)G(n-1, 1) \\ ... \\ G(n, 1)G(n-1, k-1) \\ G(n, 0)G(n-1, k)\end{matrix}\right] \end{aligned} G(n,k)G(n,k1)G(n1,1)...G(n,1)G(n1,k1)G(n,0)G(n1,k)

  • 再根据递推公式,将整个系数矩阵构造出来:

[ G ( n , k ) G ( n , k − 1 ) G ( n − 1 , 1 ) . . . G ( n , 1 ) G ( n − 1 , k − 1 ) G ( n , 0 ) G ( n − 1 , k ) ] = [ C k 0 a k C k 1 a k − 1 b . . . C k k − 1 a 1 b k − 1 C k k a 0 b k C k − 1 0 a k − 1 C k − 1 1 a k − 2 b 1 . . . C k − 1 k − 1 a k − 1 b 0 0 . . . . . . . . . . . . . . . C 1 0 a 1 b 0 C 1 1 a 0 b 1 . . . 0 0 C 0 0 a 0 b 0 0 . . . 0 0 ] [ G ( n − 1 , k ) G ( n − 1 , k − 1 ) G ( n − 2 , 1 ) . . . G ( n − 1 , 1 ) G ( n − 2 , k − 1 ) G ( n − 1 , 0 ) G ( n − 2 , k ) ] = A n − 2 [ G ( 2 , k ) G ( 2 , k − 1 ) G ( 1 , 1 ) . . . G ( 2 , 1 ) G ( 1 , k − 1 ) G ( 2 , 0 ) G ( 1 , k ) ] = A n − 2 [ f 2 k f 2 k − 1 f 1 . . . f 2 1 f 1 k − 1 f 2 0 f 1 k ] \begin{aligned} \left[ \begin{matrix} G(n, k) \\ G(n, k-1)G(n-1, 1) \\ ... \\ G(n, 1)G(n-1, k-1) \\ G(n, 0)G(n-1, k)\end{matrix}\right] &= \left[ \begin{matrix} C_k^0a^k & C_k^1a^{k-1}b & ... & C_k^{k-1}a^1b^{k-1} & C_k^ka^0b^k \\ C_{k-1}^{0}a^{k-1} & C_{k-1}^{1}a^{k-2}b^{1} & ... & C_{k-1}^{k-1}a^{k-1}b^{0} & 0 \\ ... & ... & ... & ... & ... \\ C_{1}^{0}a^{1}b^0 & C_{1}^{1}a^{0}b^{1} & ... & 0 & 0 \\ C_{0}^{0}a^{0}b^0 & 0 & ... & 0 & 0 \end{matrix}\right] \left[ \begin{matrix} G(n-1, k) \\ G(n-1, k-1)G(n-2, 1) \\ ... \\ G(n-1, 1)G(n-2, k-1) \\ G(n-1, 0)G(n-2, k)\end{matrix}\right] \\ &=A^{n-2} \left[ \begin{matrix} G(2, k) \\ G(2, k-1)G(1, 1) \\ ... \\ G(2, 1)G(1, k-1) \\ G(2, 0)G(1, k)\end{matrix}\right]\\ &=A^{n-2} \left[ \begin{matrix} f_2^k \\ f_2^{k-1}f_1 \\ ... \\ f_2^{1}f_1^{k-1} \\ f_2^{0}f_1^k \end{matrix}\right] \end{aligned} G(n,k)G(n,k1)G(n1,1)...G(n,1)G(n1,k1)G(n,0)G(n1,k)=Ck0akCk10ak1...C10a1b0C00a0b0Ck1ak1bCk11ak2b1...C11a0b10...............Ckk1a1bk1Ck1k1ak1b0...00Ckka0bk0...00G(n1,k)G(n1,k1)G(n2,1)...G(n1,1)G(n2,k1)G(n1,0)G(n2,k)=An2G(2,k)G(2,k1)G(1,1)...G(2,1)G(1,k1)G(2,0)G(1,k)=An2f2kf2k1f1...f21f1k1f20f1k

  • 这里的矩阵 A A A ,用 A [ i ] [ j ] A[i][j] A[i][j] 表示 第 i i i 行 第 j j j 列的元素,那么当 i + j > k i + j > k i+j>k 的时候,元素为 0;否则,它的表示式如下:
    C k − i j a k − i − j b j C_{k-i}^{j}a^{k-i-j}b^j Ckijakijbj
  • S ( n , k ) = ∑ i = 1 n F ( i ) k = ∑ i = 1 n G ( i , k ) S(n, k) = \sum_{i=1}^n F(i)^k = \sum_{i=1}^n G(i, k) S(n,k)=i=1nF(i)k=i=1nG(i,k),套入原矩阵,得到求和矩阵如下:

[ S ( n , k ) G ( n , k ) G ( n , k − 1 ) G ( n − 1 , 1 ) . . . G ( n , 1 ) G ( n − 1 , k − 1 ) G ( n , 0 ) G ( n − 1 , k ) ] = [ 1 B 0 A ] n − 2 [ f 1 k + f 2 k f 2 k f 2 k − 1 f 1 . . . f 2 1 f 1 k − 1 f 2 0 f 1 k ] \begin{aligned} \left[ \begin{matrix} S(n, k) \\ G(n, k) \\ G(n, k-1)G(n-1, 1) \\ ... \\ G(n, 1)G(n-1, k-1) \\ G(n, 0)G(n-1, k)\end{matrix}\right] &= \left[ \begin{matrix} 1 & B \\ 0 & A \end{matrix}\right] ^{n-2} \left[ \begin{matrix} f_1^k + f_2^k \\ f_2^k \\ f_2^{k-1}f_1 \\ ... \\ f_2^{1}f_1^{k-1} \\ f_2^{0}f_1^k \end{matrix}\right] \end{aligned} S(n,k)G(n,k)G(n,k1)G(n1,1)...G(n,1)G(n1,k1)G(n,0)G(n1,k)=[10BA]n2f1k+f2kf2kf2k1f1...f21f1k1f20f1k

  • 其中 B 为 一个行向量,并且只有一行,且为 矩阵 A 的第一行;二分求解即可;
HDU 3483 A Very Simple Problem
  • 链接:HDU 3483 A Very Simple Problem
  • 题意:给定如下求和式:
  • 在这里插入图片描述
  • 其中 1 ≤ N , M ≤ 2 × 1 0 9 , 1 ≤ x ≤ 50 1 ≤ N, M ≤ 2 \times 10^9, 1 ≤ x ≤ 50 1N,M2×109,1x50,求最后的值;
  • 难度:★★★★☆
  • 题解:令 f ( N , x , a ) = N x a N f(N, x, a) = N^xa ^N f(N,x,a)=NxaN,将 N N N 拆分成 N − 1 N-1 N1 1 1 1,然后对 N x N^x Nx 进行二项展开,得到:
    f ( N , x , a ) = N x a N = [ ( N − 1 ) + 1 ] x a N = [ C x 0 ( N − 1 ) x + C x 1 ( N − 1 ) x − 1 + . . . + C x x − 1 ( N − 1 ) 1 + C x x ( N − 1 ) 0 ] a N = a N C x 0 ( N − 1 ) x + a N C x 1 ( N − 1 ) x − 1 + . . . + a N C x x − 1 ( N − 1 ) 1 + a N C x x ( N − 1 ) 0 = a C x 0 ( N − 1 ) x a N − 1 + a C x 1 ( N − 1 ) x − 1 a N − 1 + . . . + a C x x − 1 ( N − 1 ) 1 a N − 1 + a C x x ( N − 1 ) 0 a N − 1 = a C x 0 f ( N − 1 , x , a ) + a C x 1 f ( N − 1 , x − 1 , a ) + . . . + a C x x − 1 f ( N − 1 , 1 , a ) + a C x x f ( N − 1 , 0 , a ) \begin{aligned} f(N, x, a) &= N^xa ^N \\ &= [(N-1)+1]^xa ^N \\ &= [C_x^0(N-1)^x+C_x^1(N-1)^{x-1}+...+C_x^{x-1}(N-1)^1+C_x^{x}(N-1)^0]a ^N \\ &= a ^NC_x^0(N-1)^x+a ^NC_x^1(N-1)^{x-1}+...+a ^NC_x^{x-1}(N-1)^1+a ^NC_x^{x}(N-1)^0 \\ &= aC_x^0(N-1)^xa^{N-1}+aC_x^1(N-1)^{x-1}a^{N-1}+...+aC_x^{x-1}(N-1)^1a^{N-1}+aC_x^{x}(N-1)^0a^{N-1} \\ &= aC_x^0f(N-1, x, a) + aC_x^1f(N-1, x-1, a) + ...+ aC_x^{x-1}f(N-1, 1, a) + aC_x^{x}f(N-1, 0, a) \end{aligned} f(N,x,a)=NxaN=[(N1)+1]xaN=[Cx0(N1)x+Cx1(N1)x1+...+Cxx1(N1)1+Cxx(N1)0]aN=aNCx0(N1)x+aNCx1(N1)x1+...+aNCxx1(N1)1+aNCxx(N1)0=aCx0(N1)xaN1+aCx1(N1)x1aN1+...+aCxx1(N1)1aN1+aCxx(N1)0aN1=aCx0f(N1,x,a)+aCx1f(N1,x1,a)+...+aCxx1f(N1,1,a)+aCxxf(N1,0,a)
  • 得到递推式后,可以构造出列向量和系数矩阵关系如下,其中 C n m C_n^m Cnm 为组合数:
    [ f ( N , x , a ) f ( N , x − 1 , a ) . . . f ( N , 1 , a ) f ( N , 0 , a ) ] = [ a C x 0 a C x 1 . . . a C x x − 1 a C x x 0 a C x − 1 0 . . . a C x − 1 x − 2 a C x − 1 x − 1 . . . . . . . . . . . . . . . 0 0 . . . a C 1 0 a C 1 1 0 0 . . . 0 a C 0 0 ] [ f ( N − 1 , x , a ) f ( N − 1 , x − 1 , a ) . . . f ( N − 1 , 1 , a ) f ( N − 1 , 0 , a ) ] = A N − 1 [ f ( 1 , x , a ) f ( 1 , x − 1 , a ) . . . f ( 1 , 1 , a ) f ( 1 , 0 , a ) ] = A N − 1 [ a a . . . a a ] \begin{aligned} \left[ \begin{matrix} f(N, x, a) \\ f(N, x-1, a) \\ ... \\ f(N, 1, a) \\ f(N, 0, a) \end{matrix}\right] &= \left[ \begin{matrix} aC_x^0& aC_x^1 & ... & aC_x^{x-1} & aC_x^{x}\\ 0 & aC_{x-1}^0 & ... & aC_{x-1}^{x-2} & aC_{x-1}^{x-1} \\ ... & ... & ... & ... & ... \\ 0 & 0 & ... & aC_{1}^{0} & aC_{1}^{1} \\ 0 & 0 & ... & 0 & aC_{0}^{0} \end{matrix}\right] \left[ \begin{matrix} f(N-1, x, a) \\ f(N-1, x-1, a) \\ ... \\ f(N-1, 1, a) \\ f(N-1, 0, a) \end{matrix}\right] \\ &= A^{N-1} \left[ \begin{matrix} f(1, x, a) \\ f(1, x-1, a) \\ ... \\ f(1, 1, a) \\ f(1, 0, a) \end{matrix}\right] \\ &= A^{N-1} \left[ \begin{matrix} a \\ a \\ ... \\ a \\ a \end{matrix}\right] \end{aligned} f(N,x,a)f(N,x1,a)...f(N,1,a)f(N,0,a)=aCx00...00aCx1aCx10...00...............aCxx1aCx1x2...aC100aCxxaCx1x1...aC11aC00f(N1,x,a)f(N1,x1,a)...f(N1,1,a)f(N1,0,a)=AN1f(1,x,a)f(1,x1,a)...f(1,1,a)f(1,0,a)=AN1aa...aa
  • 现在是要求和,即 s ( N , x , a ) = ∑ k = 1 N f ( k , x , a ) s(N, x, a) = \sum_{k=1}^{N}f(k, x, a) s(N,x,a)=k=1Nf(k,x,a),这里的 a a a 为常数 x x x
  • 将列向量和矩阵各扩大一阶,得到如下式子:
    [ s ( N , x , a ) f ( N , x , a ) f ( N , x − 1 , a ) . . . f ( N , 1 , a ) f ( N , 0 , a ) ] = [ 1 B 0 A ] [ s ( N − 1 , x , a ) f ( N − 1 , x , a ) f ( N − 1 , x − 1 , a ) . . . f ( N − 1 , 1 , a ) f ( N − 1 , 0 , a ) ] = [ 1 B 0 A ] N − 1 [ a a a . . . a a ] \begin{aligned} \left[ \begin{matrix} s(N,x,a) \\ f(N, x, a) \\ f(N, x-1, a) \\ ... \\ f(N, 1, a) \\ f(N, 0, a) \end{matrix}\right] &= \left[ \begin{matrix} 1 & B \\ 0 & A \end{matrix}\right] \left[ \begin{matrix} s(N-1,x,a) \\ f(N-1, x, a) \\ f(N-1, x-1, a) \\ ... \\ f(N-1, 1, a) \\ f(N-1, 0, a) \end{matrix}\right] \\ &= \left[ \begin{matrix} 1 & B \\ 0 & A \end{matrix}\right]^{N-1} \left[ \begin{matrix} a \\ a \\ a \\ ... \\ a \\ a \end{matrix}\right] \\ \end{aligned} s(N,x,a)f(N,x,a)f(N,x1,a)...f(N,1,a)f(N,0,a)=[10BA]s(N1,x,a)f(N1,x,a)f(N1,x1,a)...f(N1,1,a)f(N1,0,a)=[10BA]N1aaa...aa
  • 其中矩阵 B 为 1 × ( x + 1 ) 1 \times (x+1) 1×(x+1) 的行向量,且为矩阵 A 的第一行,构造出矩阵后进行二分求解即可;
HDU 4291 A Short problem
  • 链接:HDU 4291 A Short problem
  • 题意:已知 g ( 0 ) = 0 , g ( 1 ) = 1 , g ( n ) = 3 g ( n − 1 ) + g ( n − 2 ) g(0) = 0,g(1) = 1,g(n) = 3g(n - 1) + g(n - 2) g(0)=0g(1)=1g(n)=3g(n1)+g(n2),求 g ( g ( g ( n ) ) ) m o d    ( 1 0 9 + 7 ) g(g(g(n))) \mod (10^9 + 7) g(g(g(n)))mod(109+7)
  • 难度:★★★★☆
  • 题解:循环节 + 矩阵二分
  • 根据递推公式,构造矩阵如下:
    [ g ( n ) g ( n − 1 ) ] = [ 3 1 1 0 ] n − 1 [ 1 0 ] \left[ \begin{matrix} g(n) \\ g(n-1) \end{matrix}\right] = \left[ \begin{matrix} 3 & 1 \\ 1 & 0 \end{matrix}\right]^{n-1} \left[ \begin{matrix} 1 \\ 0 \end{matrix}\right] [g(n)g(n1)]=[3110]n1[10]
  • g ( n ) 、 g ( g ( n ) ) g(n)、g(g(n)) g(n)g(g(n)) 分别代入 n n n,得到递推矩阵如下:
    [ g ( g ( n ) ) g ( g ( n ) − 1 ) ] = [ 3 1 1 0 ] g ( n ) − 1 [ 1 0 ] \left[ \begin{matrix} g(g(n)) \\ g(g(n)-1) \end{matrix}\right] = \left[ \begin{matrix} 3 & 1 \\ 1 & 0 \end{matrix}\right]^{g(n)-1} \left[ \begin{matrix} 1 \\ 0 \end{matrix}\right] [g(g(n))g(g(n)1)]=[3110]g(n)1[10]
    [ g ( g ( g ( n ) ) ) g ( g ( g ( n ) ) − 1 ) ] = [ 3 1 1 0 ] g ( g ( n ) ) − 1 [ 1 0 ] \left[ \begin{matrix} g(g(g(n))) \\ g(g(g(n))-1) \end{matrix}\right] = \left[ \begin{matrix} 3 & 1 \\ 1 & 0 \end{matrix}\right]^{g(g(n))-1} \left[ \begin{matrix} 1 \\ 0 \end{matrix}\right] [g(g(g(n)))g(g(g(n))1)]=[3110]g(g(n))1[10]
  • 通过枚举矩阵次幂,得到
    [ 3 1 1 0 ] 222222224 m o d    ( 1 0 9 + 7 ) = [ 1 0 0 1 ] \left[ \begin{matrix} 3 & 1 \\ 1 & 0 \end{matrix}\right]^{222222224} \mod (10^9+7) = \left[ \begin{matrix} 1 & 0 \\ 0 & 1 \end{matrix}\right] [3110]222222224mod(109+7)=[1001]
  • 于是,我们发现,原等式转化成求:
    [ g ( g ( g ( n ) ) ) g ( g ( g ( n ) ) − 1 ) ] = [ 3 1 1 0 ] g ( g ( n ) ) m o d    222222224 − 1 [ 1 0 ] \left[ \begin{matrix} g(g(g(n))) \\ g(g(g(n))-1) \end{matrix}\right] = \left[ \begin{matrix} 3 & 1 \\ 1 & 0 \end{matrix}\right]^{g(g(n)) \mod 222222224 - 1} \left[ \begin{matrix} 1 \\ 0 \end{matrix}\right] [g(g(g(n)))g(g(g(n))1)]=[3110]g(g(n))mod2222222241[10]
  • 那么,问题转变为求 g ( g ( n ) ) m o d    222222224 g(g(n)) \mod 222222224 g(g(n))mod222222224,比原题降了一维;
  • 通过同样方法进行枚举,得到:
    [ 3 1 1 0 ] 183120 m o d    ( 222222224 ) = [ 1 0 0 1 ] \left[ \begin{matrix} 3 & 1 \\ 1 & 0 \end{matrix}\right]^{183120} \mod (222222224) = \left[ \begin{matrix} 1 & 0 \\ 0 & 1 \end{matrix}\right] [3110]183120mod(222222224)=[1001]
  • 于是有:
    [ g ( g ( n ) ) g ( g ( n ) − 1 ) ] = [ 3 1 1 0 ] g ( n ) m o d    183120 − 1 [ 1 0 ] \left[ \begin{matrix} g(g(n)) \\ g(g(n)-1) \end{matrix}\right] = \left[ \begin{matrix} 3 & 1 \\ 1 & 0 \end{matrix}\right]^{g(n) \mod 183120 -1} \left[ \begin{matrix} 1 \\ 0 \end{matrix}\right] [g(g(n))g(g(n)1)]=[3110]g(n)mod1831201[10]
  • 那么,问题转变为求 g ( n ) m o d    183120 g(n) \mod 183120 g(n)mod183120,回到了我们熟悉的矩阵二分;
  • 这里需要注意的是,因为求矩阵次幂的时候指数上有 − 1 -1 1,所以次幂上的数取模后如果为0,需要变成模数本身,以防出现求矩阵的 − 1 -1 1 次幂的情况;
HDU 5451 Best Solver
  • 链接:HDU 5451 Best Solver
  • 题意: y = ( 5 + 2 6 ) 2 x + 1 y = {(5+2\sqrt{6})}^{2^{x}+1} y=(5+26 )2x+1
    给定 0 < = x < 2 32 0 <= x < 2^{32} 0<=x<232,以及一个素数 M ( M ≤ 46337 ) M(M ≤ 46337) M(M46337), 求 [ y ] % M [y] \% M [y]%M 的值( [ y ] [y] [y] 表示 y y y 的整数部分);
  • 难度:★★★☆☆
  • 题解: y y y 无论当 x x x 取什么值,都一定可以表示成 A n + B n 6 A_n+B_n\sqrt{6} An+Bn6 的形式,所以我们可以得到 A n 和 B n A_n 和 B_n AnBn 的递推关系如下:
    [ A n B n ] = [ 5 12 2 5 ] [ A n − 1 B n − 1 ] = [ 5 12 2 5 ] n − 1 [ 5 2 ] \left[ \begin{matrix} A_n \\B_n\end{matrix} \right]= \left[ \begin{matrix} 5 & 12\\ 2 & 5\end{matrix} \right] \left[ \begin{matrix} A_{n-1} \\B_{n-1} \end{matrix} \right]= \left[ \begin{matrix} 5 & 12\\ 2 & 5\end{matrix} \right]^{n-1} \left[ \begin{matrix} 5 \\2 \end{matrix} \right] [AnBn]=[52125][An1Bn1]=[52125]n1[52]
    又由于 ( 5 + 2 6 ) ( 5 − 2 6 ) = 1 (5+2\sqrt{6})(5-2\sqrt{6})=1 (5+26 )(526 )=1,得到 ( 5 + 2 6 ) n ( 5 − 2 6 ) n = 1 (5+2\sqrt{6})^n(5-2\sqrt{6})^n=1 (5+26 )n(526 )n=1,则 ( A n + B n 6 ) ( A n − B n 6 ) = 1 (A_n+B_n\sqrt{6})(A_n-B_n\sqrt{6})=1 (An+Bn6 )(AnBn6 )=1,得到:
    6 B n 2 = A n 2 − 1 6B_n^2 = A_n^2 - 1 6Bn2=An21,从而推导出 B n 6 = A n 2 − 1 B_n\sqrt{6} = \sqrt{A_n^2 - 1} Bn6 =An21 ,于是 B n 6 B_n\sqrt{6} Bn6 的整数部分就是 A n − 1 A_n-1 An1,所以给定 x x x 的值,我们要求的就是 ( 2 A 2 x + 1 − 1 ) % M (2A_{2^x+1} - 1) \% M (2A2x+11)%M,只要先求 A 2 x + 1 % M A_{2^x+1} \% M A2x+1%M 的值即可;
    [ A 2 x + 1 B 2 x + 1 ] = [ 5 12 2 5 ] 2 x [ 5 2 ] \left[ \begin{matrix} A_{2^x+1} \\B_{2^x+1}\end{matrix} \right]= \left[ \begin{matrix} 5 & 12\\ 2 & 5\end{matrix} \right]^{2^x} \left[ \begin{matrix} 5 \\2 \end{matrix} \right] [A2x+1B2x+1]=[52125]2x[52]
    令矩阵 g ( n ) = [ 5 12 2 5 ] 2 n g(n) =\left[ \begin{matrix} 5 & 12\\ 2 & 5\end{matrix} \right]^{2^n} g(n)=[52125]2n
  • 当 M = 2 时,答案永远是1,直接输出不用纠结;
  • 当 M > 2 时,因为是素数,如果能够找到一个矩阵的K次幂,满足 [ 5 12 2 5 ] K = [ 1 0 0 1 ] \left[ \begin{matrix} 5 & 12\\ 2 & 5\end{matrix} \right]^K = \left[ \begin{matrix} 1 & 0\\ 0 & 1\end{matrix} \right] [52125]K=[1001],那么必定可以满足:
  • g ( n ) = [ 5 12 2 5 ] 2 n = [ 5 12 2 5 ] 2 n m o d    K g(n) =\left[ \begin{matrix} 5 & 12\\ 2 & 5\end{matrix} \right]^{2^n}=\left[ \begin{matrix} 5 & 12\\ 2 & 5\end{matrix} \right]^{2^n \mod K} g(n)=[52125]2n=[52125]2nmodK
  • 所以求解顺序就是: 利用循环节求 K K K、利用矩阵二分求 g ( n ) g(n) g(n)、最后计算 ( 2 A 2 x + 1 + M − 1 ) % M (2A_{2^x+1} + M - 1) \% M (2A2x+1+M1)%M
HDU 1977 Odd Loving Bakers
  • 链接:HDU 1977 Odd Loving Bakers
  • 题意:有 n ( n < = 100 ) n(n<=100) n(n<=100) 个人,每个人都有一个标记值,第 i i i 个人初始标记值为 X i X_i Xi ,给出一张关系网, a − > b a -> b a>b 有一条边代表 a a a 能够给 b b b 提供一点 标记值(但是需要满足提供人的标记值为奇数时才能提供),问经过 t ( t < = 1 0 9 ) t (t <= 10^9) t(t<=109)次传递后,标记值为奇数的人的个数;
  • 难度:★★★★☆
  • 题解:令第 i i i 个人在第 t t t 次传递后的 标记值 数量为 f ( t , i ) f(t, i) f(t,i),则它的标记值来源为对他有边并且上次标记值是奇数的玩家数量加上自己第 t − 1 t-1 t1 次的标记值,有状态转移方程如下:
    f ( t , i ) = f ( t − 1 , i ) + ∑ j = 0 n − 1 e ( j , i ) f(t,i) = f(t-1, i) + \sum_{j=0}^{n-1}e(j, i) f(t,i)=f(t1,i)+j=0n1e(j,i)
    e ( j , i ) = { 1 A [ j ] [ i ] = 1 , f ( t − 1 , j ) m o d    2 = 1 0 e(j,i) = \begin{cases} 1 & A[j][i]=1, f(t-1,j)\mod 2 = 1\\ 0 \end{cases} e(j,i)={10A[j][i]=1,f(t1,j)mod2=1
  • t − 1 t-1 t1 次 和 第 t t t 次 矩阵递推关系如下:
    [ f ( t , 0 ) f ( t , 1 ) . . . f ( t , n − 2 ) f ( t , n − 1 ) ] = E [ f ( t − 1 , 0 ) f ( t − 1 , 1 ) . . . f ( t − 1 , n − 2 ) f ( t − 1 , n − 1 ) ] + A [ f ( t − 1 , 0 ) % 2 f ( t − 1 , 1 ) % 2 . . . f ( t − 1 , n − 2 ) % 2 f ( t − 1 , n − 1 ) % 2 ] \begin{aligned} \left[ \begin{matrix} f(t,0) \\ f(t,1) \\ ... \\ f(t,n-2) \\ f(t,n-1) \end{matrix} \right] &= E \left[ \begin{matrix} f(t-1,0) \\ f(t-1,1) \\ ... \\ f(t-1,n-2) \\ f(t-1,n-1) \end{matrix} \right] + A \left[ \begin{matrix} f(t-1,0) \% 2\\ f(t-1,1) \% 2\\ ... \\ f(t-1,n-2) \% 2\\ f(t-1,n-1) \% 2 \end{matrix} \right] \end{aligned} f(t,0)f(t,1)...f(t,n2)f(t,n1)=Ef(t1,0)f(t1,1)...f(t1,n2)f(t1,n1)+Af(t1,0)%2f(t1,1)%2...f(t1,n2)%2f(t1,n1)%2
  • 其中 E E E 代表单位矩阵, A [ i ] [ j ] A[i][j] A[i][j] 代表 j j j i i i 有一条边;
  • 由于最后需要求的就是 f ( t , i ) f(t, i) f(t,i) 的奇偶性,所以如果 f ( t − 1 , i ) f(t-1, i) f(t1,i) 是偶数,对 f ( t , i ) f(t, i) f(t,i) 相当于没有贡献,则将矩阵等式化简为:
    [ f ( t , 0 ) % 2 f ( t , 1 ) % 2 . . . f ( t , n − 2 ) % 2 f ( t , n − 1 ) % 2 ] = ( E + A ) [ f ( t − 1 , 0 ) % 2 f ( t − 1 , 1 ) % 2 . . . f ( t − 1 , n − 2 ) % 2 f ( t − 1 , n − 1 ) % 2 ] \begin{aligned} \left[ \begin{matrix} f(t,0) \% 2 \\ f(t,1) \% 2 \\ ... \\ f(t,n-2) \% 2 \\ f(t,n-1) \% 2 \end{matrix} \right] &= (E + A) \left[ \begin{matrix} f(t-1,0) \% 2\\ f(t-1,1) \% 2\\ ... \\ f(t-1,n-2) \% 2\\ f(t-1,n-1) \% 2 \end{matrix} \right] \end{aligned} f(t,0)%2f(t,1)%2...f(t,n2)%2f(t,n1)%2=(E+A)f(t1,0)%2f(t1,1)%2...f(t1,n2)%2f(t1,n1)%2
  • 化简后得到如下矩阵递推式,利用矩阵二分进行求解即可;
    [ f ( t , 0 ) f ( t , 1 ) . . . f ( t , n − 2 ) f ( t , n − 1 ) ] % 2 = ( E + A ) [ f ( t − 1 , 0 ) f ( t − 1 , 1 ) . . . f ( t − 1 , n − 2 ) f ( t − 1 , n − 1 ) ] % 2 = ( E + A ) t − 1 [ f ( 0 , 0 ) f ( 0 , 1 ) . . . f ( 0 , n − 2 ) f ( 0 , n − 1 ) ] % 2 \begin{aligned} \left[ \begin{matrix} f(t,0) \\ f(t,1) \\ ... \\ f(t,n-2) \\ f(t,n-1) \end{matrix} \right] \% 2&= (E + A) \left[ \begin{matrix} f(t-1,0) \\ f(t-1,1) \\ ... \\ f(t-1,n-2) \\ f(t-1,n-1) \end{matrix} \right] \% 2 \\ &= (E + A)^{t-1} \left[ \begin{matrix} f(0,0) \\ f(0,1) \\ ... \\ f(0,n-2) \\ f(0,n-1) \end{matrix} \right] \% 2 \end{aligned} f(t,0)f(t,1)...f(t,n2)f(t,n1)%2=(E+A)f(t1,0)f(t1,1)...f(t1,n2)f(t1,n1)%2=(E+A)t1f(0,0)f(0,1)...f(0,n2)f(0,n1)%2
HDU 5986 Fibonacci

HDU 5986 Fibonacci

  • 题意: f ( 0 ) = 0 , f ( 1 ) = 1 f ( n ) = f ( n − 1 ) + f ( n − 2 ) ( n ≥ 2 ) x ( n ) = f ( x ( n − 1 ) ) f(0) = 0, f(1) = 1 \\ f(n) = f(n - 1) + f(n - 2) (n ≥ 2) \\ x(n) = f(x(n-1)) f(0)=0,f(1)=1f(n)=f(n1)+f(n2)(n2)x(n)=f(x(n1)) 给定 x ( 0 ) 和 p x(0) 和 p x(0)p, 求最小的 n,满足 x ( n ) ≡ x ( 0 ) ( m o d    p ) x(n) ≡ x(0) (\mod p) x(n)x(0)(modp) ( 0 < = x ( 0 ) < = 1 0 9 , p < = 200000 ) (0 <= x(0) <=10^9, p <= 200000) (0<=x(0)<=109,p<=200000)
  • 难度:★★★★★
  • 题解:循环节预处理 + 矩阵二分;
  • 关于斐波那契数取余,观察如下表,对于任何一个模数,必定能够找到一个循环节,使得后面的数字产生循环,假设有 f ( i ) m o d    p f(i) \mod p f(i)modp 的循环节为 K p K_p Kp,则必然有 :
    f ( i ) m o d    p = f ( i m o d    K p ) m o d    p f(i) \mod p = f(i \mod K_p) \mod p f(i)modp=f(imodKp)modp
i0123456789101112131415161718
f(i)0112358132134558914423337761098715972584
f(i)%10000000000000000000
f(i)%20110110110110110110
f(i)%30112022101120221011
f(i)%40112310112310112310
  • 如上图所示, f ( i ) m o d    4 f(i) \mod 4 f(i)mod4 的循环节为6,则 f ( 15 ) m o d    4 = f ( 15 m o d    6 ) m o d    4 = f ( 3 ) m o d    4 = 2 f(15) \mod 4 = f(15 \mod 6) \mod 4 = f(3) \mod 4 = 2 f(15)mod4=f(15mod6)mod4=f(3)mod4=2

  • 那么,来看如果在 n n n 已知的情况下,对于 x ( n ) m o d    p x(n) \mod p x(n)modp,满足: x ( n ) m o d    p = f ( x ( n − 1 ) ) m o d    p x(n) \mod p = f(x(n-1)) \mod p x(n)modp=f(x(n1))modp,那么这里只要知道 f ( x ) f(x) f(x) 相对于模 p p p 的循环节为 K p K_p Kp,则可以得出: x ( n ) m o d    p = f ( x ( n − 1 ) m o d    K p ) m o d    p x(n) \mod p = f(x(n-1) \mod K_p) \mod p x(n)modp=f(x(n1)modKp)modp,而因为 p p p 不大,所以这里的循环节可以通过枚举得出;

  • 于是问题转化成求 x ( n − 1 ) m o d    K p x(n-1) \mod K_p x(n1)modKp 的问题,同样继续递归求解,得到: x ( n − 1 ) m o d    K p = f ( x ( n − 2 ) m o d    K K p ) m o d    K p x(n-1) \mod K_p = f(x(n-2) \mod K_{K_p}) \mod K_p x(n1)modKp=f(x(n2)modKKp)modKp,通过这种方式不断递归,直到最后求到 x ( 0 ) x(0) x(0),再回溯回来得到 x ( n ) m o d    p x(n) \mod p x(n)modp 的值;

  • 那么可以通过枚举 n,计算 x ( n ) m o d    p x(n) \mod p x(n)modp ,如果等于 x ( 0 ) m o d    p x(0) \mod p x(0)modp 则输出最小的 n;

  • 然后再来考虑最后一个问题,什么情况下无解?

  • 为了把问题具象化,这里用几个数组来代表中间的計算过程, P i P_i Pi 代表循环节链, F i F_i Fi 代表斐波那契数模上循环节的值,则有如下公式: F i = f ( F i + 1 ) m o d    P i F_i = f(F_{i+1}) \mod P_i Fi=f(Fi+1)modPi
    在这里插入图片描述

  • 如上图所示,其中 n n n 是我们需要求的,是个未知数, P 0 P_0 P0 已知, P i P_i Pi 可以通过枚举预处理出来,并且一定能在有限步里达到循环,满足如下规律:
    P i = { p i = 0 G e t C y c l e ( P i − 1 ) 0 < = i < = m P m − 1 i > m P_i = \begin{cases} p& i = 0\\ GetCycle(P_{i-1})& 0 <= i <= m \\ P_{m-1} & i > m \end{cases} Pi=pGetCycle(Pi1)Pm1i=00<=i<=mi>m

  • 其中 GetCycle 函数实现如下,利用记忆化避免重复计算:

int GetCycle(int p) {
	if (p == 1) {
		Cycle[p] = 1;
	}
	if (Cycle[p]) {
		return Cycle[p];
	}
	int fprepre = 0;
	int fpre = 1;
	int fnow;
	for (int i = 1;; ++i) {
		fnow = (fpre + fprepre) % p;
		if (fnow == 1 && fpre == 0) {
			Cycle[p] = i;
			return i;
		}
		fprepre = fpre;
		fpre = fnow;
	}
}
  • 由于 m m m 一般比较小,所以 F 0 到 F m − 1 F_0 到 F_{m-1} F0Fm1 计算可以采用枚举法; F m 到 F n F_m 到 F_n FmFn 计算过程中,模数都是 P m P_m Pm,所以必然会产生循环,所以当产生循环还是没有得到结果的时候,就是无解了;
HDU 6755 Fibonacci Sum
  • 链接:HDU 6755 Fibonacci Sum
  • 题意:给定 N , C , K ( N , C < = 1 0 18 , K < = 1 0 5 ) N,C,K(N,C <= 10^{18}, K <=10^5) N,C,K(N,C<=1018,K<=105),对于斐波那契数列 f f f,求
    S ( N ) = ∑ i = 0 N f ( i C ) K m o d    1000000009 S(N) = \sum_{i=0}^{N}f(iC)^K \mod 1000000009 S(N)=i=0Nf(iC)Kmod1000000009
  • 难度:★★★★★
  • 题解:二次剩余 + 费马小定理 + 斐波那契数列通项公式 + 二分快速幂
  • 斐波那契数列的通项公式如下:
    f ( n ) = 1 5 [ ( 1 + 5 2 ) n − ( 1 − 5 2 ) n ] f(n) = \frac{1}{\sqrt {5} } [ (\frac {1+\sqrt{5} } {2} )^n - (\frac {1-\sqrt{5} } {2} )^n] f(n)=5 1[(21+5 )n(215 )n]
  • x = 1 + 5 2 x=\frac {1+\sqrt{5} } {2} x=21+5 , y = 1 − 5 2 y=\frac {1-\sqrt{5} } {2} y=215 , z = 1 5 z=\frac{1}{\sqrt {5} } z=5 1,将原公式化简为:
    f ( n ) = z [ x n − y n ] f(n) = z [ x^n - y^n] f(n)=z[xnyn],通过代入 i C iC iC K K K,得到:
    f ( i C ) K = { z [ x i C − y i C ] } K f(iC)^K = \{ z [ x^{iC} - y^{iC}] \} ^ K f(iC)K={z[xiCyiC]}K
  • 利用二项式定理进行展开,得到:
    f ( i C ) K = { z [ x i C − y i C ] } K = z K [ x i C − y i C ] K = z K [ C K 0 x i C K ( − 1 ) 0 + C K 1 x i C ( K − 1 ) ( − 1 ) 1 y i C + . . . + C K K ( − 1 ) K y i C K ] = z K ∑ j = 0 K C K j x i C ( K − j ) ( − 1 ) j y i C j \begin{aligned} f(iC)^K &= \{ z [ x^{iC} - y^{iC}] \} ^ K \\ &= z^K [ x^{iC} - y^{iC}]^K \\ &= z^K [ C_K^{0}x^{iCK}(-1)^0+ C_K^{1}x^{iC(K-1)}(-1)^1y^{iC} + ... + C_K^{K}(-1)^Ky^{iCK}] \\ &= z^K \sum_{j=0}^{K} C_K^{j}x^{iC(K-j)}(-1)^jy^{iCj} \end{aligned} f(iC)K={z[xiCyiC]}K=zK[xiCyiC]K=zK[CK0xiCK(1)0+CK1xiC(K1)(1)1yiC+...+CKK(1)KyiCK]=zKj=0KCKjxiC(Kj)(1)jyiCj
  • 从而得到求和公式 S ( N ) S(N) S(N) 满足:
    S ( N ) = ∑ i = 0 N f ( i C ) K m o d    1000000009 = z K ∑ i = 0 N [ ∑ j = 0 K C K j x i C ( K − j ) ( − 1 ) j y i C j ] m o d    1000000009 \begin{aligned} S(N) &= \sum_{i=0}^{N}f(iC)^K \mod 1000000009 \\ &= z^K \sum_{i=0}^{N}[ \sum_{j=0}^{K} C_K^{j}x^{iC(K-j)}(-1)^jy^{iCj} ] \mod 1000000009 \end{aligned} S(N)=i=0Nf(iC)Kmod1000000009=zKi=0N[j=0KCKjxiC(Kj)(1)jyiCj]mod1000000009
  • 这里出现了二维求和,基于 N ( N < = 1 0 18 ) N (N <= 10^{18}) N(N<=1018) K ( N < = 1 0 5 ) K(N <= 10^5) K(N<=105) 的取值范围,可以将两个求和循环进行一个交换,枚举 j ( 0 < = j < = K ) j (0 <= j <= K) j(0<=j<=K),计算 ∑ i = 0 N C K j x i C ( K − j ) ( − 1 ) j y i C j ] \sum_{i=0}^{N}C_K^{j}x^{iC(K-j)}(-1)^jy^{iCj} ] i=0NCKjxiC(Kj)(1)jyiCj]
    z K ∑ i = 0 N [ ∑ j = 0 K C K j x i C ( K − j ) ( − 1 ) j y i C j ] = z K ∑ j = 0 K [ ∑ i = 0 N C K j x i C ( K − j ) ( − 1 ) j y i C j ] z^K \sum_{i=0}^{N}[ \sum_{j=0}^{K} C_K^{j}x^{iC(K-j)}(-1)^jy^{iCj} ] = z^K \sum_{j=0}^{K}[ \sum_{i=0}^{N} C_K^{j}x^{iC(K-j)}(-1)^jy^{iCj} ] zKi=0N[j=0KCKjxiC(Kj)(1)jyiCj]=zKj=0K[i=0NCKjxiC(Kj)(1)jyiCj]
  • 枚举 j j j 之后, j j j 就成了常数,那么我们可以令 G j ( i ) = C K j x i C ( K − j ) ( − 1 ) j y i C j G_j(i) = C_K^{j}x^{iC(K-j)}(-1)^jy^{iCj} Gj(i)=CKjxiC(Kj)(1)jyiCj,来看下:
    G j ( i ) G j ( i − 1 ) = C K j x i C ( K − j ) ( − 1 ) j y i C j C K j x ( i − 1 ) C ( K − j ) ( − 1 ) j y ( i − 1 ) C j = x C ( K − j ) y C j = q j \begin{aligned} \frac {G_j(i)}{G_j(i-1)} &= \frac { C_K^{j}x^{iC(K-j)}(-1)^jy^{iCj} }{C_K^{j}x^{(i-1)C(K-j)}(-1)^jy^{(i-1)Cj}}\\ &= x^{C(K-j)}y^{Cj}\\ &= q_j \end{aligned} Gj(i1)Gj(i)=CKjx(i1)C(Kj)(1)jy(i1)CjCKjxiC(Kj)(1)jyiCj=xC(Kj)yCj=qj
  • 我们发现 G j ( i ) G_j(i) Gj(i) 是一个等比数列,那么通过等比数列通项公式,得到 G j ( i ) G_j(i) Gj(i) 的表达式如下:
    G j ( N ) = G j ( 0 ) q j N = ( − 1 ) j C K j q j N \begin{aligned} G_j(N) &= G_j(0)q_j^N\\ &= (-1)^j C_K^jq_j^N \end{aligned} Gj(N)=Gj(0)qjN=(1)jCKjqjN
  • 根据等比数列求和公式,得到:
    S ( N ) = ∑ i = 0 N f ( i C ) K m o d    1000000009 = z K ∑ j = 0 K ∑ i = 0 N G j ( i ) m o d    1000000009 = z K ∑ j = 0 K [ ( − 1 ) j C K j q j N + 1 − 1 q j − 1 ] m o d    1000000009 \begin{aligned} S(N) &= \sum_{i=0}^{N}f(iC)^K \mod 1000000009 \\ &= z^K \sum_{j=0}^{K} \sum_{i=0}^{N} G_j(i) \mod 1000000009 \\ &= z^K \sum_{j=0}^{K} [ (-1)^j C_K^j\frac {q_j^{N+1}-1}{q_j - 1} ] \mod 1000000009 \end{aligned} S(N)=i=0Nf(iC)Kmod1000000009=zKj=0Ki=0NGj(i)mod1000000009=zKj=0K[(1)jCKjqj1qjN+11]mod1000000009
  • 对于二次剩余,我们可以通过枚举求出最小的 X X X(我的机子大概 5 秒硬算出来) :
    X 2 ≡ 5 ( m o d    1000000009 ) X = 383008016 X^2 \equiv 5 (\mod 1000000009) \\ X = 383008016 X25(mod1000000009)X=383008016
  • 那么就能够得到:
    383008016 ≡ 5 ( m o d    1000000009 ) 383008016 \equiv \sqrt5 (\mod 1000000009) 3830080165 (mod1000000009)
  • 由于 x = 1 + 5 2 x=\frac {1+\sqrt{5} } {2} x=21+5 , y = 1 − 5 2 y=\frac {1-\sqrt{5} } {2} y=215 , z = 1 5 z=\frac{1}{\sqrt {5} } z=5 1,所以现在需要求这三者模上 1000000009 1000000009 1000000009 的值,利用线性同余分别求出 2 和 5 {\sqrt {5} } 5 在模 1000000009 1000000009 1000000009 域上的逆元,得到:
    276601605 ≡ 5 − 1 ( m o d    1000000009 ) 500000005 ≡ 2 − 1 ( m o d    1000000009 ) 276601605 \equiv \sqrt {5} ^{-1} (\mod 1000000009) \\ 500000005 \equiv 2^{-1} (\mod 1000000009) 2766016055 1(mod1000000009)50000000521(mod1000000009)
  • 于是可以根据这个,计算所有 x , y , z x, y, z x,y,z 在模 1000000009 域上的值,如下:
    x = 1 + 5 2 = ( 1 + 383008016 ) ∗ 500000005 ( m o d    1000000009 ) = 691504013 y = 1 − 5 2 = ( 1 − 383008016 ) ∗ 500000005 ( m o d    1000000009 ) = 308495997 z = 1 5 = 5 − 1 ( m o d    1000000009 ) = 276601605 x=\frac {1+\sqrt{5} } {2} = (1+383008016)*500000005 (\mod 1000000009) = 691504013 \\ y=\frac {1-\sqrt{5} } {2}= (1-383008016)*500000005 (\mod 1000000009) = 308495997\\ z=\frac{1}{\sqrt {5} } = \sqrt {5} ^{-1} (\mod 1000000009) = 276601605 x=21+5 =(1+383008016)500000005(mod1000000009)=691504013y=215 =(1383008016)500000005(mod1000000009)=308495997z=5 1=5 1(mod1000000009)=276601605
  • 由于 q j = x C ( K − j ) y C j q_j = x^{C(K-j)}y^{Cj} qj=xC(Kj)yCj,利用二分快速幂求解得出 q j q_j qj,再求 q j − 1 q_j - 1 qj1的逆元,从而求得 S ( N ) S(N) S(N) 的值。
  • 这里需要求组合数 C K j m o d    1000000009 C_K^j \mod 1000000009 CKjmod1000000009,可以利用递推公式如下:
    C K j = { 1 j = 0 C K j − 1 K − j + 1 j 0 < j < = K C_K^j= \begin{cases} 1& j=0\\ C_K^{j-1} \frac {K-j+1} {j}&0<j<=K \end{cases} CKj={1CKj1jKj+1j=00<j<=K
  • 递推公式 O(1),需要求 j j j 的逆元;
  • 这题时间卡的比较紧,需要注意一些优化点, 如下:
  • 1)求逆元采用费马小定理: a − 1 ≡ a p − 2 m o d    p a^{-1} \equiv a^{p-2} \mod p a1ap2modp
  • 2)预处理 [ 1 , 1 0 5 ] [1, 10^5] [1,105] 的 逆元 存储在数组中;
  • 3)预处理 5 的二次剩余的 i ( i < = 1 0 5 ) i (i<=10^5) i(i<=105) 次幂存储在数组中;
  • 4)利用欧拉定理进行降幂: a b ≡ a b m o d    p − 1 m o d    p a^{b} \equiv a^{b \mod p-1} \mod p ababmodp1modp
  • 5) q j = x C ( K − j ) y C j q_j = x^{C(K-j)}y^{Cj} qj=xC(Kj)yCj 的可以通过递推把复杂度从 O ( l o g n ) O(log_n) O(logn) 将为 O ( 1 ) O(1) O(1) q j = q j − 1 y C x C q_j = q_{j-1} \frac {y^C}{x^C} qj=qj1xCyC
  • 6) + 1 +1 +1 − 1 -1 1用加减法代替乘法;
  • 7)用 G++ 提交;
HDU 4959 Poor Akagi
  • 链接:HDU 4959 Poor Akagi
  • 题意:给定递推数列 L ( n ) = { 2 n = 0 1 n = 1 L ( n − 1 ) + L ( n − 2 ) n > 1 L(n) = \begin{cases}2 & n = 0\\ 1 & n = 1 \\ L(n-1) + L(n-2) & n > 1\end{cases} L(n)=21L(n1)+L(n2)n=0n=1n>1,给出 n ( n < = 1 0 18 ) , k < = 1 0 5 n(n <= 10^{18}),k <= 10^5 n(n<=1018)k<=105,求 ∑ i = 0 n L ( i ) k   m o d   1 0 9 + 7 \sum_{i=0}^{n} L(i)^k \ mod \ 10^9+7 i=0nL(i)k mod 109+7
  • 难度:★★★★★
  • 题解:费马小定理 + 卢卡斯数通项公式 + 矩阵二分快速幂
  • 这类问题一般有以下几种做法:
  • 1)矩阵:线性递推式 加上取模,很容易联想到的是矩阵二分幂,构造的矩阵一般是 ( k + 1 ) × ( k + 1 ) (k+1) \times (k+1) (k+1)×(k+1) 这个量级的,但是这里 k k k 很大,所以无法用矩阵来做。
  • 2)循环节:再来看被模数是固定的,那么能否找到一个 1 0 6 10^6 106 量级的循环节,然后存下循环节内所有的数,再利用循环节求解,很不幸,循环节是 200000016 200000016 200000016 ,太大了。
  • 3)二次剩余 + 通项公式:另一种做法就是通项公式了。首先求出这个序列的通项公式,通项公式求解方法有很多,类似斐波那契数列的推导方法,这里不再累述,可以参考这篇文章:斐波那契数列通项公式推导
  • 我们直接给出这个数列的通项公式如下: L ( n ) = ( 1 + 5 2 ) n + ( 1 − 5 2 ) n L(n) = ( \frac {1 + \sqrt 5}{2} )^n + ( \frac {1 - \sqrt 5}{2} )^n L(n)=(21+5 )n+(215 )n
  • 那么这里存在 5 \sqrt 5 5 ,所以要对模数 1000000007 找 5 的二次剩余,结果没有二次剩余,所以这种方法也行不通;
  • 4)二次域运算:还是从通项公式出发,令 p = 1 + 5 2 , q = 1 − 5 2 p = \frac {1 + \sqrt 5}{2},q = \frac {1 - \sqrt 5}{2} p=21+5 q=215 ,则有 L ( n ) = p n + q n L(n) = p^n + q^n L(n)=pn+qn
  • 那么对 L ( n ) k L(n)^k L(n)k 进行二项展开得到: L ( n ) k = ( p n + q n ) k = C k 0 p n k + C k 1 p n ( k − 1 ) q n + . . . + C k k − 1 p n q n ( k − 1 ) + C k k q n k = ∑ j = 0 k C k j p n ( k − j ) q n j \begin{aligned} L(n)^k &= (p^n + q^n)^k \\ &= C_k^0p^{nk} + C_k^1p^{n(k-1)}q^n + ... + C_k^{k-1}p^nq^{n(k-1)} + C_k^kq^{nk} \\ &= \sum_{j=0}^{k} C_k^jp^{n(k-j)}q^{nj} \end{aligned} L(n)k=(pn+qn)k=Ck0pnk+Ck1pn(k1)qn+...+Ckk1pnqn(k1)+Ckkqnk=j=0kCkjpn(kj)qnj
  • 那么 ∑ i = 0 n L ( i ) k \sum_{i=0}^{n} L(i)^k i=0nL(i)k 就是将上述二项式再进行一次求和,得到:
    ∑ i = 0 n L ( i ) k = ∑ i = 0 n ∑ j = 0 k C k j p i ( k − j ) q i j \sum_{i=0}^{n} L(i)^k = \sum_{i=0}^{n} \sum_{j=0}^{k} C_k^jp^{i(k-j)}q^{ij} i=0nL(i)k=i=0nj=0kCkjpi(kj)qij
  • 然后将 i i i j j j 的位置进行一个交换,得到:
    ∑ i = 0 n L ( i ) k = ∑ j = 0 k C k j ∑ i = 0 n p i ( k − j ) q i j \sum_{i=0}^{n} L(i)^k = \sum_{j=0}^{k} C_k^j \sum_{i=0}^{n} p^{i(k-j)}q^{ij} i=0nL(i)k=j=0kCkji=0npi(kj)qij
  • 这里的组合数,可以通过递推在均摊 O ( 1 ) O(1) O(1) 的时间复杂度内求得: C k j = k ! j ! ( k − j ) ! = k ! ( k − j + 1 ) j ( j − 1 ) ! ( k − j + 1 ) ! = k − j + 1 j C k j − 1 \begin{aligned}C_k^j &= \frac {k!}{j!(k-j)!} \\ &= \frac {k!(k-j+1)}{j(j-1)!(k-j+1)!} \\ &= \frac {k-j+1} {j} C_k^{j-1}\end{aligned} Ckj=j!(kj)!k!=j(j1)!(kj+1)!k!(kj+1)=jkj+1Ckj1
  • 由于 k k k 的范围远小于 n n n,我们可以枚举 j = 0... k j = 0 ... k j=0...k,然后再想办法计算内层循环,这样 j j j 在每次循环中就变成了常量,我们只需要关心变量的部分,即: s ( i ) = ∑ i = 0 n p i ( k − j ) q i j s(i) = \sum_{i=0}^{n} p^{i(k-j)}q^{ij} s(i)=i=0npi(kj)qij
  • a ( i ) = [ p k − j q j ] i a(i) = [ p^{k-j}q^{j} ]^i a(i)=[pkjqj]i,则有: a ( i ) = [ p k − j q j ] i = [ ( 1 + 5 2 ) k − j ( 1 − 5 2 ) j ] i = [ 2 − k ( 1 + 5 ) k − j ( 1 − 5 ) j ] i = ( X + Y 5 ) i \begin{aligned}a(i) &= [ p^{k-j}q^{j} ] ^i = [ (\frac {1 + \sqrt 5}{2})^{k-j}(\frac {1 - \sqrt 5}{2})^{j} ] ^i \\ &= [ 2^{-k}(1 + \sqrt 5)^{k-j}(1 - \sqrt 5)^{j} ] ^i \\ &= (X + Y \sqrt 5) ^ i\end{aligned} a(i)=[pkjqj]i=[(21+5 )kj(215 )j]i=[2k(1+5 )kj(15 )j]i=(X+Y5 )i
  • 构造矩阵: [ a ( i ) X a ( i ) Y ] = [ X 5 Y Y X ] n [ 1 0 ] \left[ \begin{matrix} a(i)_X \\ a(i)_Y\end{matrix} \right] = \left[ \begin{matrix} X & 5Y \\ Y & X\end{matrix} \right]^n \left[ \begin{matrix} 1 \\ 0\end{matrix} \right] [a(i)Xa(i)Y]=[XY5YX]n[10]
  • 由于 5 \sqrt 5 5 那部分系数一定是会被消去的,所以我们可以不管,只需要计算有理数部分的域,将求和部分也代入矩阵中,得到: [ s ( i ) X a ( i ) X a ( i ) Y ] = [ 1 X 5 Y 0 X 5 Y 0 Y X ] n [ 1 1 0 ] \left[ \begin{matrix} s(i)_X \\ a(i)_X \\ a(i)_Y\end{matrix} \right] = \left[ \begin{matrix} 1 & X & 5Y \\ 0 & X & 5Y \\ 0 & Y & X\end{matrix} \right]^n \left[ \begin{matrix} 1 \\ 1 \\ 0\end{matrix} \right] s(i)Xa(i)Xa(i)Y=100XXY5Y5YXn110
  • 利用矩阵二分求解 s ( i ) X s(i)_X s(i)X 再乘上 C k j C_k^j Ckj 加和就是答案了。
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 算法训练营篇pdf 是一个提供算法学习资料的电子书。这本书可以帮助算法学习者巩固和提高他们的算法能力。 首先,算法训练营篇pdf 的内容丰富多样。它涵盖了各种算法主题,如动态规划、图论、贪心算法等。每个主题都有详细的讲解和示例代码,以帮助读者更好地理解和应用这些算法。 其次,这本书的难度适中。它适合已经具备一定算法基础的学习者一步提高自己的能力。通过学习这本书,读者可以一步提升自己解决复杂算法问题的能力,同时也可以深入了解各种常见的算法思想和技巧。 此外,这本书的编写方式也十分友好。作者在讲解算法原理的同时,还会结合具体的例子和图形行说明,使得读者更容易理解和掌握算法的应用方法。同时,每个章节都有练习题目,可以帮助读者巩固所学的知识并提高实践能力。 总的来说,算法训练营篇pdf 是一个很好的算法学习资料。它的内容丰富多样,难度适中,编写方式友好。读者通过学习这本书,可以提高自己的算法能力,掌握各种常见的算法思想和技巧,为解决实际问题提供了有力的工具和思路。 ### 回答2: 《算法训练营篇pdf》是一份高级算法训练资料,旨在帮助读者深入学习和理解算法的高级概念和技巧。该资料包含了丰富的算法案例和问题,涵盖了动态规划、图论、字符串处理等多个领域。 这份资料首先从基础的算法知识出发,引导读者逐步。通过详细的讲解和示例代码,读者可以掌握各种高级算法的原理和实现方法。同时,该资料注重实践,提供了大量的练习题目,帮助读者巩固所学知识,并提供了解题思路和解决方法。 《算法训练营篇pdf》的特点之一是注重实际应用。它涵盖了大量的真实场景和实际问题,并展示了如何用高级算法解决这些问题。这对于读者来说是具有很大帮助的,因为他们可以更好地理解算法在实际工程中的应用场景和效果。 此外,该资料还提供了丰富的参考文献和扩展阅读材料,帮助读者一步拓宽和深入学习。同时,读者也可以通过该资料获得关于算法训练和职业发展的一些建议和指导。 总之,《算法训练营篇pdf》是一份对于想要深入学习高级算法的读者来说非常有价值的资料。它适合那些已经具备了一定算法基础,但希望一步提升能力和应用技巧的人。通过学习这份资料,读者将能够更好地应用高级算法解决实际问题,提高自己的算法能力,并在算法领域取得更高的成就。 ### 回答3: 《算法训练营篇》PDF 是一个深入学习算法的教材。该教材通过系统化的讲解和实践编程练习,帮助学习者更加深入地理解和应用算法。 该PDF内容主要涵盖了算法的知识和应用,包括动态规划、贪心算法、图论、高级数据结构、字符串处理等方面的内容。通过这些知识的学习,可以帮助学习者提高算法解决问题的能力,一步提升编程的水平。 在《算法训练营篇》PDF中,每个章节都有对应的理论讲解和算法实现的练习题。通过理论的学习,学习者可以掌握算法的核心思想和解题思路。而通过实践编程练习,可以帮助学习者巩固所学知识,提高算法编程的实际应用能力。 《算法训练营篇》PDF的特点是内容丰富、逻辑性强、难度适中。无论是想一步提高算法水平的程序员,还是希望在算法竞赛中取得好成绩的学生,都可以通过学习这本教材来达到自己的目标。 总之,《算法训练营篇》PDF是一本非常实用和有价值的教材,可以帮助学习者深入学习和应用算法,提高算法解决问题的能力,同时也为其他算法教学提供了参考和指导。推荐有一定算法基础的读者阅读并行实践,相信会有很大的收获。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

英雄哪里出来

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值