解题报告 (七) 矩阵快速幂【入门】

一、矩阵快速幂 算法讲解

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

二、矩阵快速幂 解题报告

HDU 1575 Tr A

  • 链接:HDU 1575 Tr A
  • 题意:给定一个矩阵 A A A,求 A k A^k Ak 对角线元素的和模 9973 9973 9973 的值;
  • 难度:★☆☆☆☆
  • 题解:矩阵二分快速幂模板题,二分求解后累加对角线元素即可;

POJ 3070 Fibonacci

  • 链接:POJ 3070 Fibonacci
  • 题意: 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) F0=0,F1=1,Fn=Fn1+Fn2(n2),求 F n m o d    10000 F_n \mod 10000 Fnmod10000
  • 难度:★☆☆☆☆
  • 题解:矩阵二分快速幂模板题,直接构造系数矩阵 [ 1 1 1 0 ] \left[ \begin{matrix} 1 & 1 \\ 1 & 0\end{matrix} \right] [1110] 后二分求解;

HDU 2157 How many ways??

  • 链接:HDU 2157 How many ways??
  • 题意:给定一个有向图,求 a a a b b b 经过 k k k 步的方案数;
  • 难度:★☆☆☆☆
  • 题解:利用矩阵求有向图路径数的模板题。利用邻接矩阵的转置构造矩阵,然后对这个矩阵进行 k k k 次幂求解;

HDU 1757 A Simple Math Problem

  • 链接:HDU 1757 A Simple Math Problem
  • 题意:有函数 f(x) 满足如下:
    f ( x ) = { x x < 10 a 0 f ( x − 1 ) + a 1 f ( x − 2 ) + . . . + a 9 f ( x − 10 ) x > = 10 f(x)=\begin{cases} x & x < 10\\ a_0f(x-1) + a_1f(x-2) + ... + a_9f(x-10) & x>= 10\\ \end{cases} f(x)={ xa0f(x1)+a1f(x2)+...+a9f(x10)x<10x>=10
  • 给定 a 0 到 a 9 a_0 到 a_9 a0a9 和两个正整数 k ( 2 × 1 0 9 ) 、 m ( m < 1 0 5 ) k (2 \times 10^9) 、 m(m < 10^5) k(2×109)m(m<105),求 f ( k ) % m f(k) \% m f(k)%m
  • 难度:★☆☆☆☆
  • 题解:一维递推类问题,构造矩阵如下:
    [ f ( x ) f ( x − 1 ) . . . f ( x − 8 ) f ( x − 9 ) ] = [ a 0 a 1 . . . a 8 a 9 1 0 . . . 0 0 . . . . . . . . . . . . . . . 0 0 . . . 0 0 0 0 . . . 1 0 ] [ f ( x − 1 ) f ( x − 2 ) . . . f ( x − 9 ) f ( x − 10 ) ] \left[ \begin{matrix} f(x)\\ f(x-1)\\ ... \\ f(x-8) \\ f(x-9) \end{matrix}\right] = \left[ \begin{matrix} a_0 & a_1 & ... & a_8 & a_9 \\ 1 & 0 & ... & 0 & 0 \\ ... &... & ... &... &... \\ 0 & 0 & ... & 0 & 0 \\ 0 & 0 & ... & 1 & 0 \end{matrix}\right] \left[ \begin{matrix} f(x-1)\\ f(x-2)\\ ... \\ f(x-9) \\ f(x-10) \end{matrix}\right] f(x)f(x1)...f(x8)f(x9)=a01...00a10...00...............a80...01a90...00f(x1)f(x2)...f(x9)f(x10)
  • 继续化简后得到:
    [ f ( x ) f ( x − 1 ) . . . f ( x − 8 ) f ( x − 9 ) ] = [ a 0 a 1 . . . a 8 a 9 1 0 . . . 0 0 . . . . . . . . . . . . . . . 0 0 . . . 0 0 0 0 . . . 1 0 ] x − 9 [ f ( 9 ) f ( 8 ) . . . f ( 1 ) f ( 0 ) ] \left[ \begin{matrix} f(x)\\ f(x-1)\\ ... \\ f(x-8) \\ f(x-9) \end{matrix}\right] = \left[ \begin{matrix} a_0 & a_1 & ... & a_8 & a_9 \\ 1 & 0 & ... & 0 & 0 \\ ... &... & ... &... &... \\ 0 & 0 & ... & 0 & 0 \\ 0 & 0 & ... & 1 & 0 \end{matrix}\right] ^ {x-9} \left[ \begin{matrix} f(9)\\ f(8)\\ ... \\ f(1) \\ f(0) \end{matrix}\right] f(x)f(x1)...f(x8)f(x9)=a01...00a10...00...............a80...01a90...00x9f(9)f(8)...f(1)f(0)
  • 构造矩阵后进行二分求解,再乘上列向量,得到列向量的第一个元素就是答案;

POJ 2118 Firepersons

  • 链接:POJ 2118 Firepersons
  • 题意:给定数列 a 0 , a 1 , a 2 . . . a k − 1 a_0,a_1,a_2...a_{k-1} a0,a1,a2...ak1 和 数列 b 1 , b 2 , b 3 . . . b k b_1,b_2,b_3...b_{k} b1,b2,b3...bk,并且在 n > = k n >= k n>=k 的时候满足:
    a n = ∑ i = 1 k a n − i b i m o d    10000 a_n = \sum_{i=1}^{k}a_{n-i}b_i \mod 10000 an=i=1kanibimod10000
  • 给出 n n n,求 a n a_{n} an 的值;
  • 难度:★☆☆☆☆
  • 题解:直接构造矩阵如下:

[ a n a n − 1 . . . a n − k + 2 a n − k + 1 ] = [ b 1 b 2 . . . b k − 1 b k 1 0 . . . 0 0 0 1 . . . 0 0 0 0 . . . 0 0 0 0 . . . 1 0 ] [ a n − 1 a n − 2 . . . a n − k + 1 a n − k ] m o d    10000 = A n − k + 1 [ a k − 1 a k − 2 . . . a 1 a 0 ] m o d    10000 \begin{aligned} \left[ \begin{matrix} a_n \\ a_{n-1} \\ ... \\ a_{n-k+2} \\ a_{n-k+1} \end{matrix} \right] &= \left[ \begin{matrix} b_1 & b_2 & ... & b_{k-1} & b_k \\ 1 & 0 & ...& 0 & 0 \\ 0 & 1 & ...& 0 & 0 \\ 0 & 0 & ...& 0 & 0 \\ 0 & 0 & ...& 1 & 0 \end{matrix} \right] \left[ \begin{matrix} a_{n-1} \\ a_{n-2} \\ ... \\ a_{n-k+1} \\ a_{n-k} \end{matrix} \right] \mod 10000 \\ &= A^{n-k+1} \left[ \begin{matrix} a_{k-1} \\ a_{k-2} \\ ... \\ a_1 \\ a_0 \end{matrix} \right] \mod 10000 \end{aligned} anan1...ank+2ank+1=b11000b20100...............bk10001bk0000an1an2...ank+1ankmod10000=Ank+1ak1ak2...a1a0mod10000

  • 直接上矩阵二分;

HDU 5015 233 Matrix

链接:HDU 5015 233 Matrix
题意:对于一个 n × m n \times m n×m 的矩阵 ( n < = 10 , m < = 1 0 9 ) (n<=10, m<=10^9) (n<=10,m<=109),矩阵第一行是 233 , 2333 , 23333... 233,2333,23333... 233,2333,23333...,并且知道矩阵的值满足
a i , j = a i − 1 , j + a i , j − 1 ( i , j > 0 ) a_{i,j} = a_{i-1,j} + a_{i,j-1} (i,j > 0) ai,j=ai1,j+ai,j1(i,j>0)
给出 a 1 , 0 , a 2 , 0 , . . . , a n , 0 a_{1,0},a_{2,0},...,a_{n,0} a1,0,a2,0,...,an,0,求 a n , m % 10000007 a_{n,m} \% 10000007 an,m%10000007

  • 难度:★★☆☆☆
    题解: n n n 很小, m m m 很大,所以一般能联想到 n n n 为矩阵阶数, m m m 作为二分的幂,进行矩阵构造;
    根据给出的规则,有
    a i , j = a i − 1 , j + a i , j − 1 ( i , j > 0 ) = ( a i − 2 , j + a i − 1 , j − 1 ) + a i , j − 1 = ( a i − 3 , j + a i − 2 , j − 1 ) + a i − 1 , j − 1 + a i , j − 1 . . . = a 0 , j + a 1 , j − 1 + . . . + a i − 1 , j − 1 + a i , j − 1 = a 0 , j + ∑ k = 1 i a k , j − 1 \begin{aligned} a_{i,j} &= a_{i-1,j} + a_{i,j-1} (i,j > 0) \\ &= (a_{i-2,j} + a_{i-1,j-1}) + a_{i,j-1} \\ &= (a_{i-3,j} + a_{i-2,j-1} ) + a_{i-1,j-1} + a_{i,j-1} \\ & ...\\ &= a_{0,j} + a_{1,j-1} + ... + a_{i-1,j-1} + a_{i,j-1} \\ & = a_{0,j} + \sum_{k=1}^ia_{k,j-1} \end{aligned} ai,j=ai1,j+ai,j1(i,j>0)=(ai2,j+ai1,j1)+ai,j1=(ai3,j+ai2,j1)+ai1,j1+ai,j1...=a0,j+a1,j1+...+ai1,j1+ai,j1=a0,j+k=1iak,j1
    则有 a i , m = a 0 , m + ∑ k = 1 i a k , m − 1 a_{i,m} = a_{0,m} + \sum_{k=1}^ia_{k,m-1} ai,m=a0,m+k=1iak,m1
    其中 a 0 , m a_{0,m} a0,m 是另一个数列,即 a 0 , m = { 0 m = 0 233 m = 1 10 × a 0 , m − 1 + 3 m > 1 a_{0,m}=\begin{cases} 0 & m=0\\ 233&m=1\\ 10 \times a_{0,m-1} + 3 & m > 1 \end{cases} a0,m=023310×a0,m1+3m=0m=1m>1
    [ a n , m a n − 1 , m . . . a 1 , m a 0 , m 1 ] = [ 1 1 . . . 1 10 3 0 1 . . . 1 10 3 . . . . . . . . . . . . . . . . . . 0 0 . . . 1 10 3 0 0 . . . 0 10 3 0 0 . . . 0 0 1 ] [ a n , m − 1 a n − 1 , m − 1 . . . a 1 , m − 1 a 0 , m − 1 1 ] = [ 1 1 . . . 1 10 3 0 1 . . . 1 10 3 . . . . . . . . . . . . . . . . . . 0 0 . . . 1 10 3 0 0 . . . 0 10 3 0 0 . . . 0 0 1 ] m − 1 [ a n , 1 a n − 1 , 1 . . . a 1 , 1 a 0 , 1 1 ] \begin{aligned} \left[ \begin{matrix} a_{n,m} \\a_{n-1,m}\\...\\a_{1,m}\\a_{0,m}\\1 \end{matrix} \right]&= \left[ \begin{matrix} 1 & 1 & ... & 1 & 10 & 3\\ 0 & 1 & ... & 1 & 10 & 3\\ ... & ... & ... & ... & ... & ... \\ 0 & 0 & ... & 1 & 10 & 3\\ 0 & 0 & ... & 0 & 10 & 3 \\ 0 & 0 & ... & 0 & 0 & 1\end{matrix} \right] \left[ \begin{matrix} a_{n,m-1} \\a_{n-1,m-1}\\...\\a_{1,m-1}\\a_{0,m-1}\\ 1 \end{matrix} \right]\\&= \left[ \begin{matrix} 1 & 1 & ... & 1 & 10 & 3\\ 0 & 1 & ... & 1 & 10 & 3\\ ... & ... & ... & ... & ... & ... \\ 0 & 0 & ... & 1 & 10 & 3\\ 0 & 0 & ... & 0 & 10 & 3 \\ 0 & 0 & ... & 0 & 0 & 1\end{matrix} \right]^{m-1} \left[ \begin{matrix} a_{n,1} \\a_{n-1,1}\\...\\a_{1,1}\\a_{0,1}\\ 1 \end{matrix} \right] \end{aligned} an,man1,m...a1,ma0,m1=10...00011...000..................11...1001010...1010033...331an,m1an1,m1...a1,m1a0,m11=10...00011...000..................11...1001010...1010033...331m1an,1an1,1...a1,1a0,11
    直接利用输入构造矩阵后求解即可;

HDU 4686 Arc of Dream

  • 链接:HDU 4686 Arc of Dream
  • 题意: A o d ( n ) = ∑ i = 0 n − 1 a i b i Aod(n) = \sum_{i=0}^{n-1}a_ib_i Aod(n)=i=0n1aibi
  • 其中 a 0 = A 0 , a i = a i − 1 A X + A Y b 0 = B 0 , b i = b i − 1 B X + B Y a_0 = A_0, a_i = a_{i-1} A_X + A_Y \\ b_0 = B_0, b_i = b_{i-1} B_X + B_Y a0=A0,ai=ai1AX+AYb0=B0,bi=bi1BX+BY
  • 给定 0 < = n < = 1 0 18 , 0 < = A 0 , A X , A Y , B 0 , B X , B Y < = 2 × 1 0 9 0<=n<=10^{18}, 0<=A_0,A_X,A_Y,B_0,B_X,B_Y<=2 \times 10^9 0<=n<=1018,0<=A0,AX,AY,B0,BX,BY<=2×109,求 A o d ( n ) % 1000000007 Aod(n) \% 1000000007 Aod(n)%1000000007
  • 难度:★★☆☆☆
  • 题解:首先列出递推式 a i b i a_ib_i aibi 的递推关系如下:
    a i b i = ( a i − 1 A X + A Y ) ( b i − 1 B X + B Y ) = A X B Y a i − 1 b i − 1 + A X B Y a i − 1 + A Y B X b i − 1 + A Y B Y \begin{aligned} a_ib_i &= (a_{i-1} A_X + A_Y)(b_{i-1} B_X + B_Y)\\ & = A_XB_Ya_{i-1}b_{i-1} + A_XB_Ya_{i-1} + A_YB_Xb_{i-1} + A_YB_Y \end{aligned} aibi=(ai1AX+AY)(bi1BX+BY)=AXBYai1bi1+AXBYai1+AYBXbi1+AYBY
  • S ( n ) = ∑ i = 0 n a i b i S(n) = \sum_{i=0}^{n}a_ib_i S(n)=i=0naibi
  • 构造矩阵列向量包含 S ( n ) 、 a n b n 、 a n 、 b n 、 1 S(n)、a_nb_n、a_n、b_n、1 S(n)anbnanbn1

[ S ( n ) a n b n a n b n 1 ] = [ 1 A X B X A X B Y A Y B X A Y B Y 0 A X B X A X B Y A Y B X A Y B Y 0 0 A X 0 A Y 0 0 0 B X B Y 0 0 0 0 1 ] [ S ( n − 1 ) a n − 1 b n − 1 a n − 1 b n − 1 1 ] \begin{aligned} \left[ \begin{matrix} S(n) \\ a_nb_n \\ a_n \\ b_n \\ 1 \end{matrix}\right] &= \left[ \begin{matrix} 1 & A_XB_X & A_XB_Y & A_YB_X & A_YB_Y \\ 0 & A_XB_X & A_XB_Y & A_YB_X & A_YB_Y \\ 0 & 0 & A_X & 0 & A_Y \\ 0 & 0 & 0 & B_X & B_Y \\ 0 & 0 & 0 & 0 & 1 \end{matrix}\right] \left[ \begin{matrix} S(n-1) \\ a_{n-1}b_{n-1} \\ a_{n-1} \\ b_{n-1} \\ 1 \end{matrix}\right] \\ \end{aligned} S(n)anbnanbn1=10000AXBXAXBX000AXBYAXBYAX00AYBXAYBX0BX0AYBYAYBYAYBY1S(n1)an1bn1an1bn11

  • 矩阵二分求解即可;
  • 注意最后的答案 A o d ( n ) = S ( n ) − a n b n Aod(n) = S(n) - a_nb_n Aod(n)=S(n)anbn

HDU 6470 Count

  • 链接:HDU 6470 Count
  • 题意:已知公式: f ( n ) = { 1 ( n = 1 ) 2 ( n = 2 ) f ( n − 1 ) + 2 f ( n − 2 ) + n 3 ( n > 2 ) f(n) = \begin{cases} 1 & (n = 1) \\ 2 & (n = 2) \\ f(n-1) + 2f(n-2) + n^3 & (n > 2) \end{cases} f(n)=12f(n1)+2f(n2)+n3(n=1)(n=2)(n>2)
  • 给出 n,求 f ( n ) % 123456789 f(n) \% 123456789 f(n)%123456789
  • 难度:★★☆☆☆
  • 题解:这是一个带变量的递推式;将所有和 n 有关的变量都放入列向量中进行矩阵构造,如下:
    [ f ( n ) f ( n − 1 ) n 3 n 2 n 1 ] = [ 1 2 1 3 3 1 1 0 0 0 0 0 0 0 1 3 3 1 0 0 0 1 2 1 0 0 0 0 1 1 0 0 0 0 0 1 ] n − 2 [ f ( 2 ) f ( 1 ) 8 4 2 1 ] \left[ \begin{matrix} f(n) \\f(n-1)\\ n^3 \\n^2\\n\\1 \end{matrix} \right]= \left[ \begin{matrix} 1 & 2 & 1 & 3 & 3 & 1 \\ 1 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 1 & 3 & 3 & 1\\0 & 0 & 0 &1 & 2 & 1 \\ 0 & 0 & 0 & 0 & 1 & 1 \\ 0 & 0 & 0 &0 & 0 & 1\end{matrix} \right]^{n-2} \left[ \begin{matrix} f(2) \\ f(1) \\ 8 \\ 4 \\ 2 \\ 1 \end{matrix} \right] f(n)f(n1)n3n2n1=110000200000101000303100303210101111n2f(2)f(1)8421

HDU 2793 Sum of Tribonacci Numbers

  • 链接:HDU 2793 Sum of Tribonacci Numbers
  • 题意: T [ 0 ] = T [ 1 ] = T [ 2 ] = 1 T[0] = T[1] = T[2] = 1 T[0]=T[1]=T[2]=1 T [ n ] = T [ n − 1 ] + T [ n − 2 ] + T [ n − 3 ] ( n > = 3 ) T[n] = T[n - 1] + T[n - 2] + T[n - 3] (n >= 3) T[n]=T[n1]+T[n2]+T[n3](n>=3)
  • 给定 a 和 b 求 ( T [ a ] + T [ a + 1 ] + . . . + T [ b ] ) % 1 , 000 , 000 , 007 (T[a] + T[a + 1] + ... + T[b]) \% 1,000,000,007 (T[a]+T[a+1]+...+T[b])%1,000,000,007
  • 难度:★★☆☆☆
  • 题解:一维递推类问题,构造系数矩阵如下:
    [ T [ n ] T [ n − 1 ] T [ n − 2 ] ] = [ 1 1 1 1 0 0 0 1 0 ] [ T [ n − 1 ] T [ n − 2 ] T [ n − 3 ] ] \left[ \begin{matrix} T[n] \\ T[n-1] \\ T[n-2] \end{matrix}\right] = \left[ \begin{matrix} 1 & 1 & 1\\ 1 & 0 & 0 \\ 0 & 1 & 0 \end{matrix}\right] \left[ \begin{matrix} T[n-1] \\ T[n-2] \\ T[n-3] \end{matrix}\right] T[n]T[n1]T[n2]=110101100T[n1]T[n2]T[n3]
  • S [ n ] = ∑ i = 0 n T [ i ] S[n] = \sum_{i=0}^n{T[i]} S[n]=i=0nT[i],则 ( T [ a ] + T [ a + 1 ] + . . . + T [ b ] ) = S [ b ] − S [ a − 1 ] (T[a] + T[a + 1] + ... + T[b]) = S[b] - S[a-1] (T[a]+T[a+1]+...+T[b])=S[b]S[a1],于是问题转化成求 S [ n ] S[n] S[n],将它代入系数矩阵中,得到如下矩阵递推式:
    [ S [ n ] T [ n ] T [ n − 1 ] T [ n − 2 ] ] = [ 1 1 1 1 0 1 1 1 0 1 0 0 0 0 1 0 ] [ S [ n − 1 ] T [ n − 1 ] T [ n − 2 ] T [ n − 3 ] ] = [ 1 1 1 1 0 1 1 1 0 1 0 0 0 0 1 0 ] n − 2 [ S [ 2 ] T [ 2 ] T [ 1 ] T [ 0 ] ] = A n − 2 [ 3 1 1 1 ] \begin{aligned} \left[ \begin{matrix} S[n] \\ T[n] \\ T[n-1] \\ T[n-2] \end{matrix}\right] &= \left[ \begin{matrix} 1 & 1 & 1 & 1 \\ 0 & 1 & 1 & 1 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \end{matrix}\right] \left[ \begin{matrix} S[n-1] \\ T[n-1] \\ T[n-2] \\ T[n-3] \end{matrix}\right] \\ &= \left[ \begin{matrix} 1 & 1 & 1 & 1 \\ 0 & 1 & 1 & 1 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \end{matrix}\right]^{n-2} \left[ \begin{matrix} S[2] \\ T[2] \\ T[1] \\ T[0] \end{matrix}\right] \\ &= A^{n-2} \left[ \begin{matrix} 3 \\ 1 \\ 1 \\ 1 \end{matrix}\right] \\ \end{aligned} S[n]T[n]T[n1]T[n2]=1000111011011100S[n1]T[n1]T[n2]T[n3]=1000111011011100n2S[2]T[2]T[1]T[0]=An23111
  • 对矩阵 A 进行二分求幂,再乘上列向量,得到的列向量的第一个元素就是 S [ n ] S[n] S[n]

HDU 3306 Another kind of Fibonacci

  • 链接:HDU 3306 Another kind of Fibonacci
  • 题意: A ( 0 ) = 1 , A ( 1 ) = 1 A(0) = 1 , A(1) = 1 A(0)=1,A(1)=1 A ( n ) = X ∗ A ( n − 1 ) + Y ∗ A ( n − 2 ) ( n > = 2 ) A(n) = X * A(n - 1) + Y * A(n - 2) (n >= 2) A(n)=XA(n1)+YA(n2)(n>=2) S ( n ) = ∑ i = 0 n A ( i ) 2 S(n) = \sum_{i=0}^{n}A(i)^2 S(n)=i=0nA(i)2
  • 难度:★★☆☆☆
  • 题解:首先利用递推式,可以得出 A ( n ) 2 A(n)^2 A(n)2 的递推式如下:
    A ( n ) 2 = ( X ∗ A ( n − 1 ) + Y ∗ A ( n − 2 ) ) 2 = X 2 A ( n − 1 ) 2 + 2 X Y A ( n − 1 ) A ( n − 2 ) + Y 2 A ( n − 2 ) 2 \begin{aligned} A(n)^2 &= (X * A(n - 1) + Y * A(n - 2))^2 \\ &= X^2 A(n - 1)^2 + 2XYA(n - 1)A(n - 2) + Y^2 A(n - 2)^2 \end{aligned} A(n)2=(XA(n1)+YA(n2))2=X2A(n1)2+2XYA(n1)A(n2)+Y2A(n2)2
  • 所以要求 S ( n ) = S ( n − 1 ) + A ( n ) 2 S(n) = S(n-1) + A(n)^2 S(n)=S(n1)+A(n)2, 矩阵列向量至少包含 S ( n ) 、 A ( n ) 2 、 A ( n ) A ( n − 1 ) 、 A ( n − 1 ) 2 S(n)、A(n)^2、A(n)A(n-1)、A(n-1)^2 S(n)A(n)2A(n)A(n1)A(n1)2 四项;
  • 构造系数矩阵如下:
    [ S ( n ) A ( n ) 2 A ( n ) A ( n − 1 ) A ( n − 1 ) 2 ] = [ 1 X 2 2 X Y Y 2 0 X 2 2 X Y Y 2 0 X Y 0 0 1 0 0 ] [ S ( n − 1 ) A ( n − 1 ) 2 A ( n − 1 ) A ( n − 2 ) A ( n − 2 ) 2 ] = [ 1 X 2 2 X Y Y 2 0 X 2 2 X Y Y 2 0 X Y 0 0 1 0 0 ] n − 1 [ S ( 1 ) A ( 1 ) 2 A ( 1 ) A ( 0 ) A ( 0 ) 2 ] = A n − 1 [ 2 1 1 1 ] \begin{aligned} \left[ \begin{matrix} S(n) \\ A(n)^2 \\ A(n)A(n-1) \\ A(n-1)^2 \end{matrix}\right] &= \left[ \begin{matrix} 1 & X^2 & 2XY & Y^2 \\ 0 & X^2 & 2XY & Y^2 \\ 0 & X & Y & 0 \\ 0 & 1 & 0 & 0 \end{matrix}\right] \left[ \begin{matrix} S(n-1) \\ A(n-1)^2 \\ A(n-1)A(n-2) \\ A(n-2)^2 \end{matrix}\right] \\ &=\left[ \begin{matrix} 1 & X^2 & 2XY & Y^2 \\ 0 & X^2 & 2XY & Y^2 \\ 0 & X & Y & 0 \\ 0 & 1 & 0 & 0 \end{matrix}\right]^{n-1} \left[ \begin{matrix} S(1) \\ A(1)^2 \\ A(1)A(0) \\ A(0)^2 \end{matrix}\right] \\ &= A^{n-1} \left[ \begin{matrix} 2 \\ 1 \\ 1 \\ 1\end{matrix}\right] \\ \end{aligned} S(n)A(n)2A(n)A(n1)A(n1)2=1000X2X2X12XY2XYY0Y2Y200S(n1)A(n1)2A(n1)A(n2)A(n2)2=1000X2X2X12XY2XYY0Y2Y200n1S(1)A(1)2A(1)A(0)A(0)2=An12111
  • 矩阵二分求解即可;

HDU 2791 Tower

  • 链接:HDU 2791 Tower
  • 题意: f ( n ) = { 1 ( n = 1 ) C ( n = 2 ) 2 C ∗ f ( n − 1 ) − f ( n − 2 ) ( n > 2 ) f(n) = \begin{cases} 1 & (n = 1) \\ C & (n = 2) \\ 2C*f(n-1) - f(n-2) & (n > 2) \end{cases} f(n)=1C2Cf(n1)f(n2)(n=1)(n=2)(n>2)
    s ( n ) = ∑ i = 1 n f ( i ) 2 s(n) = \sum_{i=1}^{n}f(i)^2 s(n)=i=1nf(i)2
  • 给定常数 C , n , m C,n,m Cnm,求 s ( n ) % m s(n) \% m s(n)%m 的值;
  • 难度:★★☆☆☆
  • 题解:直接根据 平方 和 前缀和 构造出系数矩阵如下, 二分求解即可;
    [ s ( n ) f ( n ) 2 f ( n ) f ( n − 1 ) f ( n − 1 ) 2 ] = [ 1 4 C 2 − 4 C 1 0 4 C 2 − 4 C 1 0 2 C − 1 0 0 1 0 0 ] n − 2 [ 1 + C 2 C 2 C 1 ] \left[ \begin{matrix} s(n) \\f(n)^2\\ f(n)f(n-1)\\f(n-1)^2 \end{matrix} \right]= \left[ \begin{matrix} 1 & 4C^2 & -4C &1\\ 0 & 4C^2 & -4C & 1\\0 & 2C & -1 & 0\\0 & 1 & 0 &0\end{matrix} \right]^{n-2} \left[ \begin{matrix} 1+C^2 \\C^2\\ C\\1 \end{matrix} \right] s(n)f(n)2f(n)f(n1)f(n1)2=10004C24C22C14C4C101100n21+C2C2C1

POJ 3233 Matrix Power Series

  • 链接:POJ 3233 Matrix Power Series
  • 题意:给出一个 n × n n × n n×n 的矩阵 A A A 和两个正整数 k , m k, m k,m, 求 S ( k ) = ( A + A 2 + A 3 + … + A k ) m o d    m S(k) = (A + A^2 + A^3 + … + A^k) \mod m S(k)=(A+A2+A3++Ak)modm
  • 难度:★★☆☆☆
  • 题解:
  • 第一步,定义一个列向量如下:
    [ S ( k ) I ] \left[ \begin{matrix} S(k) \\ I\end{matrix} \right] [S(k)I]
  • 第二步,生成递推矩阵,矩阵元素用 ? 代替:
    [ S ( k ) I ] = [ ? ? ? ? ] [ S ( k − 1 ) I ] \left[ \begin{matrix} S(k) \\ I \end{matrix} \right] = \left[ \begin{matrix} ? & ? \\ ? & ?\end{matrix} \right] \left[ \begin{matrix} S({k-1}) \\ I \end{matrix} \right] [S(k)I]=[????][S(k1)I]
  • 第三步,根据递推式,构造矩阵如下( A A A 为原矩阵, O O O 为零矩阵, I I I 为单位矩阵):
    [ S ( k ) I ] = [ A A O I ] [ S ( k − 1 ) I ] = [ A A O I ] k − 1 [ S ( 1 ) I ] = B k − 1 [ A I ] \begin{aligned} \left[ \begin{matrix} S(k) \\ I \end{matrix} \right] &= \left[ \begin{matrix} A & A \\ O & I\end{matrix} \right]\left[ \begin{matrix} S(k-1) \\ I \end{matrix} \right] \\ &=\left[ \begin{matrix} A & A \\ O & I\end{matrix} \right]^{k-1}\left[ \begin{matrix} S(1) \\ I \end{matrix} \right] \\ &=B^{k-1}\left[ \begin{matrix} A \\ I \end{matrix} \right] \end{aligned} [S(k)I]=[AOAI][S(k1)I]=[AOAI]k1[S(1)I]=Bk1[AI]
  • 矩阵 B B B 的阶数为矩阵 A A A 的两倍,利用矩阵二分求解 B B B k − 1 k-1 k1 次幂后再乘上列向量,得到的列向量的上半部分就是所求的 S ( k ) S(k) S(k)

POJ 3734 Blocks

  • 链接:POJ 3734 Blocks
  • 题意:一个长度为 N ( N < = 1 0 9 ) N (N <= 10^9) N(N<=109) 的串,只由 ‘R’ ‘B’ ‘G’ ‘Y’ 四种字符组成,期望 ‘R’ 和 ‘G’ 的数量为偶数, 求 方案数 S ( N ) m o d    10007 S(N) \mod 10007 S(N)mod10007
  • 难度:★★☆☆☆
  • 题解:根据 ‘R’ 和 ‘G’ 的奇偶性来建立状态,列出如下表格:
状态编码 状态描述
00 ‘R’偶数个,'G’偶数个
01 ‘R’偶数个,'G’奇数个
10 ‘R’奇数个,'G’偶数个
11 ‘R’奇数个,'G’奇数个
  • f ( n , i ) f(n, i) f(n,i) 表示长度为 n n n,状态为 i i i 的方案数,则有状态转移方程如下:
    f ( n , 00 ) = f ( n − 1 , 01 ) + f ( n − 1 , 10 ) + 2 ∗ f ( n − 1 , 00 ) f ( n , 01 ) = f ( n − 1 , 11 ) + f ( n − 1 , 00 ) + 2 ∗ f ( n − 1 , 01 ) f ( n , 10 ) = f ( n − 1 , 11 ) + f ( n − 1 , 00 ) + 2 ∗ f ( n − 1 , 10 ) f ( n , 11 ) = f ( n − 1 , 10 ) + f ( n − 1 , 01 ) + 2 ∗ f ( n − 1 , 11 ) f(n, 00) = f(n-1, 01) + f(n-1, 10) + 2 * f(n-1, 00) \\ f(n, 01) = f(n-1, 11) + f(n-1, 00) + 2 * f(n-1, 01) \\ f(n, 10) = f(n-1, 11) + f(n-1, 00) + 2 * f(n-1, 10) \\ f(n, 11) = f(n-1, 10) + f(n-1, 01) + 2 * f(n-1, 11) \\ f(n,00)=f(n1,01)+f(n1,10)+2f(n1,00)f(n,01)=f(n1,11)+f(n1,00)+2f(n1,01)f(n,10)=f(n1,11)+f(n1,00)+2f(n1,10)f(n,11)=f(n1,10)+f(n1,01)+2f(n1,11)
  • 构造系数矩阵如下:
    [ f ( n , 00 ) f ( n , 01 ) f ( n , 10 ) f ( n , 11 ) ] = [ 2 1 1 0 1 2 0 1 1 0 2 1 0 1 1 2 ] [ f ( n − 1 , 00 ) f ( n − 1 , 01 ) f ( n − 1 , 10 ) f ( n − 1 , 11 ) ] = A n [ f ( 0 , 00 ) f ( 0 , 01 ) f ( 0 , 10 ) f ( 0 , 11 ) ] = A n [ 1 0 0 0 ] \begin{aligned} \left[ \begin{matrix} f(n,00) \\ f(n,01) \\ f(n,10) \\ f(n,11) \end{matrix} \right] &= \left[ \begin{matrix} 2 & 1 & 1 & 0 \\ 1 & 2 & 0 &1 \\ 1 & 0 & 2 & 1 \\ 0 & 1 & 1 & 2\end{matrix} \right]\left[ \begin{matrix} f(n-1,00) \\ f(n-1,01) \\ f(n-1,10) \\ f(n-1,11) \end{matrix} \right] \\ &=A^{n} \left[ \begin{matrix} f(0,00) \\ f(0,01) \\ f(0,10) \\ f(0,11) \end{matrix} \right] \\ &=A^{n} \left[ \begin{matrix} 1 \\ 0 \\ 0 \\ 0 \end{matrix} \right] \end{aligned} f(n,00)f(n,01)f(n,10)f(n,11)=2110120110210112f(n1,00)f(n1,01)f(n1,10)f(n1,11)=Anf(0,00)f(0,01)f(0,10)f(0,11)=An1000
  • 矩阵二分求解;

HDU 2065 "红色病毒"问题

链接:HDU 2065 "红色病毒"问题
题意:现在有一长度为N的字符串,满足一下条件:

  • (1) 字符串仅由A,B,C,D四个字母组成;
  • (2) A出现偶数次(也可以不出现);
  • (3) C出现偶数次(也可以不出现);
    求长度为 N (N < 264)的字符串方案数 MOD 100;
  • 题解:首先按照规则对字符串进行编码, d p [ N ] [ s t a t e ] dp[N][state] dp[N][state] 代表长度为N,状态为 state 的字符串的方案数,state 是如下枚举:
state 含义
00 A和C都出现偶数次
01 A出现偶数次,C出现奇数次
10 A出现奇数次,C出现偶数次
11 A和C都出现奇数次
  • 长度为N 和 N-1 的两个字符串,只相差一个字符,所以不可能同时改变两种字符的奇偶性,那么,容易列出状态转移方程:
    d p [ N ] [ 00 ] = 2 ∗ d p [ N − 1 ] [ 00 ] + d p [ N − 1 ] [ 01 ] + d p [ N − 1 ] [ 10 ] ; d p [ N ] [ 01 ] = 2 ∗ d p [ N − 1 ] [ 01 ] + d p [ N − 1 ] [ 00 ] + d p [ N − 1 ] [ 11 ] ; d p [ N ] [ 10 ] = 2 ∗ d p [ N − 1 ] [ 10 ] + d p [ N − 1 ] [ 00 ] + d p [ N − 1 ] [ 11 ] ; d p [ N ] [ 11 ] = 2 ∗ d p [ N − 1 ] [ 11 ] + d p [ N − 1 ] [ 01 ] + d p [ N − 1 ] [ 10 ] ; dp[N][00] = 2*dp[N-1][00] + dp[N-1][01] + dp[N-1][10];\\ dp[N][01] = 2*dp[N-1][01] + dp[N-1][00] + dp[N-1][11];\\ dp[N][10] = 2*dp[N-1][10] + dp[N-1][00] + dp[N-1][11];\\ dp[N][11] = 2*dp[N-1][11] + dp[N-1][01] + dp[N-1][10]; dp[N][00]=2dp[N1][00]+dp[N1][01]+dp[N1][10];dp[N][01]=2dp[N1][01]+dp[N1][00]+dp[N1][11];dp[N][10]=2dp[N1][10]+dp[N1][00]+dp[N1][11];dp[N][11]=2dp[N1][11]+dp[N1][01]+dp[N1][10];
  • 将状态转移方程转换成矩阵表示,如下:
    A = [ 2 1 1 0 1 2 0 1 1 0 2 1 0 1 1 2 ] A = \left[ \begin{matrix} 2 & 1 &1 & 0\\ 1 & 2 &0 & 1\\ 1 & 0 &2 & 1\\ 0 & 1 &1 & 2 \end{matrix} \right] \\ A=2110120110210112
  • 主对角线全等于2,次对角线全为0,其它均为1;
  • d p [ N ] dp[N] dp[N]这个列向量可以通过矩阵乘法求解:
    d p [ N ] = A N ∗ [ 1 0 0 0 ] dp[N] = A^N * \left[ \begin{matrix}1 \\ 0 \\ 0 \\ 0 \end{matrix} \right] dp[N]=AN1000
  • 由于 N 比较大,所以采用矩阵二分取模,最后乘上列向量 dp[0] 得解;
  • 注意:这里的 N 要用 unsigned __int64,不然转换成负数逻辑就错了;

HDU 2604 Queue

  • 链接:HDU 2604 Queue
  • 题意:竟然刷到了自己的题;出题的时候自己都没想到用矩阵;一个由 f f f m m m 组成的字符串,任何子串都不能包含 f m f 和 f f f fmf 和 fff fmffff,求这样的长度为 L ( L < = 1 0 6 ) L (L <= 10^6) L(L<=106) 的字符串的种数;
  • 难度:★★☆☆☆
  • 题解:将 m m m 看成是 0 0 0 f f f 看成是 1 1 1,那么可以知道对于长度小于 3 的串,所有串都是合法的;对于长度大于等于3的串,它的末尾总共有六种状态: 001 、 011 、 100 、 101 、 110 、 111 001、011、100、101、110、111 001011100101110111,当往后添加一个字符的时候,考虑合法性,得到如下状态转移图:
100
101
110
111
001
011
  • 构造状态转移矩阵如下:
    [ 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ] \begin{aligned} \left[ \begin{matrix} 0 & 0 &0& 0& 0& 0& 0& 0\\ 0& 0& 0& 0& 1& 0& 0& 0\\ 0& 0& 0& 0& 0& 0& 0& 0\\ 0& 1& 0& 0& 0& 1& 0& 0\\ 0& 0& 0& 0& 0& 0& 1& 0\\ 0& 0& 0& 0& 0& 0& 1& 0\\ 0& 0& 0& 1& 0& 0& 0& 1\\ 0& 0& 0& 1& 0& 0& 0& 1\end{matrix} \right] \end{aligned} 0000000000010000000000000000001101000000000100000000110000000011
  • 进行矩阵二分求解,最后答案就是所有的合法状态的方案数的和;

HDU 3519 Lucky Coins Sequence

  • 链接:HDU 3519 Lucky Coins Sequence
  • 题意:长度为 n ( n < = 1 0 9 ) n (n <= 10^9) n(n<=109) 的 ‘01’ 串,如果存在 000 000 000 或者 111 111 111,则代表合法,求合法串的数量;
  • 难度:★★☆☆☆
  • 题解:首先 ‘存在’ 这件事情,本身就比较晦涩,有可能存在 000 000 000 1111 1111 1111 000111000 000111000 000111000,种类太多,所以我们可以逆向考虑,求一下不存在的情况,即求所有不存在 000 000 000 111 111 111 的串的数量,然后再用 2 n 2^n 2n 减掉这个数量就是答案了;
  • 既然要求不存在 000 000 000 111 111 111 的串,那么 000 000 000 111 111 111 就是非法状态,不能进行状态转移,其它长度为 3 的状态都能进行状态转移,有状态转移图如下:
100
101
110
111
001
010
011
000
  • 构造出系数矩阵如下:
    [ 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 ] \left[ \begin{matrix} 0 &0 &0 &0 &1 &0 &0 &0 \\ 0 &0 &0 &0 &1 &0 &0 &0 \\ 0 &1 &0 &0 &0 &1 &0 &0 \\ 0 &1 &0 &0 &0 &1 &0 &0 \\ 0 &0 &1 &0 &0 &0 &1 &0 \\ 0 &0 &1 &0 &0 &0 &1 &0 \\ 0 &0 &0 &1 &0 &0 &0 &0 \\ 0 &0 &0 &1 &0 &0 &0 &0 \\ \end{matrix}\right] 0000000000110000000011000000001111000000001100000000110000000000
  • 观察矩阵第三行,代表的是 010 这个状态可以由 001 和 101 两个状态转移过来;
  • 求解矩阵的 n − 2 n-2 n2 次幂,然后累加对应状态的和,再用 2^n 减去就是答案,注意取模的时候输出不能为负数,所以如果为负数需要再加上 MOD;

HDU 2276 Kiki & Little Kiki 2

链接:HDU 2276 Kiki & Little Kiki 2
题意:一个 01 循环串,长度小于为 L ( L < = 100 ) L(L<=100) LL<=100, 这个串每秒都会进行一次变换,变换规则是:如果左边是1,则改变自己的状态,否则保持不变;给定初始状态,问 n 秒以后这个串的状态;

  • 难度:★★☆☆☆
  • 题解:首先定义状态 f ( n , L ) f(n, L) f(n,L) 表示 n 秒以后,第 L 个字符是 0 还是 1;则有如下状态转移方程:
    f ( n , L ) = { f ( n − 1 , L ) ( f ( n − 1 , L − 1 ) = 0 ) 1 − f ( n − 1 , L ) ( f ( n − 1 , L − 1 ) = 1 ) f(n, L)= \begin{cases} f(n-1, L) & (f(n-1, L-1)=0) \\ 1 - f(n-1, L) & (f(n-1, L-1)=1) \end{cases} f(n,L)={ f(n1,L)1f(n1,L)(f(n1,L1)=0)(f(n1,L1)=1)
  • 经过简化,我们发现,其实可以表示得更加简单:
    f ( n , L ) = f ( n − 1 , L − 1 ) − f ( n − 1 , L ) f(n, L) = f(n-1, L-1)−f(n−1,L) f(n,L)=f(n1,L1)f(n1,L)
  • 由于 f ( n − 1 , L ) f(n−1,L) f(n1,L) 的取值只有0 1,所以根据同余的性质得到:
    f ( n , L ) = f ( n − 1 , L − 1 ) + f ( n − 1 , L ) f(n, L) = f(n-1, L-1)+f(n−1,L) f(n,L)=f(n1,L1)+f(n1,L)
  • 根据这个递推式构造矩阵:
    [ f ( n , 1 ) f ( n , 2 ) . . . f ( n , L ) ] = [ 1 0 . . . 0 1 1 1 . . . 0 0 . . . . . . . . . 1 0 0 0 . . . 1 1 ] [ f ( n − 1 , 1 ) f ( n − 1 , 2 ) . . . f ( n − 1 , L ) ] \left[ \begin{matrix} f(n, 1) \\f(n, 2) \\ ... \\ f(n, L)\end{matrix} \right]= \left[ \begin{matrix} 1 & 0 & ... & 0& 1\\ 1 & 1 & ... & 0 & 0\\ ... & ... & ... & 1& 0 \\ 0 & 0 & ... & 1 & 1\end{matrix} \right] \left[ \begin{matrix} f(n-1, 1) \\f(n-1, 2) \\ ... \\ f(n-1, L)\end{matrix} \right] f(n,1)f(n,2)...f(n,L)=11...001...0............00111001f(n1,1)f(n1,2)...f(n1,L)
  • 利用矩阵求二分求解后,乘上右边列向量初值,注意这里可以采用位运算进行加速:
  • 1)乘法:位与 & 代替;
  • 2)加法:异或 ^ 代替;
  • 3)对2取模:位与 & 1 代替;

HDU 3096 Life Game

  • 链接:HDU 3096 Life Game
  • 题意:在这里插入图片描述
  • 边长为 N ( N < = 6 ) N (N <= 6 ) N(N<=6)蜂巢格子,初始化的时候每个格子都有一定的病毒,每过1秒,会向相邻的6个格子(边缘的会更少)散布病毒,散布数量为当前病毒的个数,问经过 L ( L < = 1 0 6 ) L(L <= 10^6) L(L<=106) 秒以后,所有格子病毒的总数;
  • 难度:★★☆☆☆
    在这里插入图片描述
  • 题解:上图中,左边的编码用于状态转移,右边的编码用于矩阵连乘的时候保持连续性,最大程度上减小矩阵的阶数。
  • 我们先来看第一种编码,当前格子的编号记为(r, c):
  • 1)行列数目。行数为2N-1,列数和行号(从0开始数)强相关。令行号r<N,则列数为r+N;否则,列数为(3N-2)-r。
  • 2)合法区域。如何判断一个坐标(x, y)是否在合法区域内,先判x,x的范围为[0, 2N-1);再判y,y的范围为[0, 列数),列数的计算参照1)。
  • 3)6个邻居坐标。
    • a.左右邻居。 (r,c-1)和(r,c+1)。
    • b.上排邻居。 行号r<N时,上排邻居坐标(r-1,c-1)和(r-1,c);否则,上排邻居坐标(r-1,c)和(r-1,c+1)。
    • c.下排邻居。 行号r<N-1时,下排邻居坐标(r+1,c)和(r-1,c+1);否则,下排邻居坐标(r+1,c-1)和(r+1,c)。
    • 注:以上邻居坐标都需要通过2)的合法区域坐标检测。
  • 4)N = 6时的格子总数为1 + 6 + 12 + 18 + 24 + 30 = 91。
  • 然后就可以通过每个格子的合法邻居进行状态转移了。
  • 对每个格子进行编号,如果两个格子之间是连通的,则建立一条双向边,然后进行临接矩阵的构造,构造完矩阵就是裸的矩阵二分了,注意最后输出答案的时候要用 int64;

HDU 2842 Chinese Rings

  • 链接:HDU 2842 Chinese Rings
  • 题意:初始状态为 N 个 1,例如: 11111111111 ⏟ N \underbrace{11111111111}_{\rm N} N 11111111111,现在需要经过一些操作,将这些 1 全部变成 0;操作有如下几种:
  • 1)最左边的数可以在一步内自由切换,1 变 0, 0 变 1;
  • 2)如果前 k k k 个数都是 0 0 0,且第 k + 1 k+1 k+1 个数是 1 1 1,那么第 k + 2 k+2 k+2 个数可以在 1 步内切换状态; ( 0 ≤ k ≤ 7 ) (0 ≤ k ≤ 7) (0k7)
  • 问 当有 N ( N ≤ 1 0 9 ) N (N ≤ 10^9) N(N109) 个1的时候,最少多少步把它全部变成 0;
  • 难度:★★★☆☆
  • 题解:可以先利用 BFS 搜索出长度为前 8 的情况,发现有规律: 1 、 2 、 5 、 10 、 21 、 42 、 85 、 170 1、2、5、10、21、42、85、170 12510214285170,得到递推式如下:
    f ( n ) = { 2 f ( n − 1 ) n 为 偶 数 2 f ( n − 1 ) + 1 n 为 奇 数 f(n) = \begin{cases} 2f(n-1) & n为偶数 \\ 2f(n-1) + 1 & n 为奇数 \end{cases} f(n)={ 2f(n1)2f(n1)+1nn
  • 根据奇偶性,再把公式化简得到:
    f ( n ) = { 4 f ( n − 2 ) + 2 n 为 偶 数 4 f ( n − 2 ) + 1 n 为 奇 数 f(n) = \begin{cases} 4f(n-2)+2 & n为偶数 \\ 4f(n-2) + 1 & n 为奇数 \end{cases} f(n)={ 4f(n2)+24f(n2)+1nn
  • 针对奇数和偶数的情况,构造两个矩阵如下:
    偶 数 : [ f ( n ) 1 ] = [ 4 2 0 1 ] [ f ( n − 2 ) 1 ] = A e n / 2 − 1 [ 2 0 ] 奇 数 : [ f ( n ) 1 ] = [ 4 1 0 1 ] [ f ( n − 2 ) 1 ] = A o ( n + 1 ) / 2 − 1 [ 1 0 ] \begin{aligned} 偶数:\left[ \begin{matrix} f(n) \\ 1 \end{matrix}\right] &= \left[ \begin{matrix} 4 & 2 \\ 0 & 1 \end{matrix}\right] \left[ \begin{matrix} f(n-2) \\ 1 \end{matrix}\right] = A_e^{n/2-1}\left[ \begin{matrix} 2 \\ 0 \end{matrix}\right]\\ 奇数:\left[ \begin{matrix} f(n) \\ 1 \end{matrix}\right] &= \left[ \begin{matrix} 4 & 1 \\ 0 & 1 \end{matrix}\right] \left[ \begin{matrix} f(n-2) \\ 1 \end{matrix}\right] = A_o^{(n+1)/2-1}\left[ \begin{matrix} 1 \\ 0 \end{matrix}\right] \end{aligned} [f(n)1][f(n)1]=[4021][f(n2)1]=Aen/21[20]=[4011][f(n2)1]=Ao(n+1)/21[10]
  • 矩阵二分求解;

POJ 3735 Training little cats

  • 链接:POJ 3735 Training little cats
  • 题意: n n n 只小猫咪 ( n < = 100 ) (n <= 100) (n<=100) ,支持以下三种操作:
  • 1)让第 i i i 只猫咪增加1个坚果;
  • 2)让第 i i i 只猫咪吃掉所有坚果;
  • 3)交换第 i i i 和 第 j j j 只猫咪的坚果;
  • 输入包含 k ( k < = 100 ) k (k <= 100) k(k<=100) 次以上的的操作,并且重复 m m m 次,问最后每只小猫咪有多少个坚果;
  • 难度:★★★☆☆
  • 题解:首先,将所有的猫咪拥有的坚果数看成是一个行向量,如果有 n n n 只猫咪,那么就建立一个 n + 1 n+1 n+1 的行向量 (最后一个元素为1,用来做加法操作);每个操作都是一个矩阵,行向量右乘矩阵后得到操作完以后的坚果情况:
    [ a 1 a 2 . . . a n 1 ] \begin{aligned} \left[ \begin{matrix} a_1 & a_2 & ... & a_{n} & 1\end{matrix}\right] \end{aligned} [a1a2...an1]
  • 1)让第 i i i 只猫咪增加1个坚果,构造一个 ( n + 1 ) × ( n + 1 ) (n+1) \times (n+1) (n+1)×(n+1) 单位矩阵,且 第 i i i 列最后一个元素置1;
    [ 1 0 . . . 0 . . . 0 0 0 1 . . . 0 . . . 0 0 . . . . . . . . . . . . . . . . . . . . . 0 0 . . . 0 . . . 1 0 0 0 . . . 1 . . . 0 1 ] \left[ \begin{matrix} 1 & 0 & ... & 0 & ... & 0 & 0 \\ 0 & 1 & ... & 0 & ... & 0 & 0 \\ ... & ... & ... & ... & ... & ... & ... \\ 0 & 0 & ... & 0 & ... & 1 & 0\\ 0 & 0 & ... & 1 & ... & 0 & 1\end{matrix}\right] 10...0001...00...............00...01...............00...1000...01
  • 2)让第 i i i 只猫咪吃掉所有坚果,构造一个 ( n + 1 ) × ( n + 1 ) (n+1) \times (n+1) (n+1)×(n+1) 单位矩阵,且 第 i i i 列所有元素置0;
    [ 1 0 . . . 0 . . . 0 0 0 1 . . . 0 . . . 0 0 . . . . . . . . . . . . . . . . . . . . . 0 0 . . . 0 . . . 1 0 0 0 . . . 0 . . . 0 1 ] \left[ \begin{matrix} 1 & 0 & ... & 0 & ... & 0 & 0 \\ 0 & 1 & ... & 0 & ... & 0 & 0 \\ ... & ... & ... & ... & ... & ... & ... \\ 0 & 0 & ... & 0 & ... & 1 & 0\\ 0 & 0 & ... & 0 & ... & 0 & 1\end{matrix}\right] 10...0001...00...............00...00...............00...1000...01
  • 3)交换第 i i i 和 第 j j j 只猫咪的坚果,构造一个 ( n + 1 ) × ( n + 1 ) (n+1) \times (n+1) (n+1)×(n+1) 单位矩阵,交换 第 i i i 和 第 j j j 列的元素;
  • 然后将这 k 个矩阵相乘,得到一个最终的变换矩阵;
  • 注意:这里不能模拟乘法,直接模拟会超时,注意到变换矩阵是个稀疏矩阵,所以其实可以只改变影响对应猫的列即可,k次操作后得到一个变换矩阵,对这个变换矩阵进行二分求幂,最后左乘上一个 n + 1 n+1 n+1 的行向量 就是答案了;

猜你喜欢

转载自blog.csdn.net/WhereIsHeroFrom/article/details/109725171