文章目录
-
-
- 一、矩阵快速幂 算法讲解
- 二、矩阵快速幂 解题报告
-
- HDU 1575 Tr A
- POJ 3070 Fibonacci
- HDU 2157 How many ways??
- HDU 1757 A Simple Math Problem
- POJ 2118 Firepersons
- HDU 5015 233 Matrix
- HDU 4686 Arc of Dream
- HDU 6470 Count
- HDU 2793 Sum of Tribonacci Numbers
- HDU 3306 Another kind of Fibonacci
- HDU 2791 Tower
- POJ 3233 Matrix Power Series
- POJ 3734 Blocks
- HDU 2065 "红色病毒"问题
- HDU 2604 Queue
- HDU 3519 Lucky Coins Sequence
- HDU 2276 Kiki & Little Kiki 2
- HDU 3096 Life Game
- HDU 2842 Chinese Rings
- POJ 3735 Training little cats
-
一、矩阵快速幂 算法讲解
夜深人静写算法(二十)矩阵快速幂
二、矩阵快速幂 解题报告
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=Fn−1+Fn−2(n≥2),求 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(x−1)+a1f(x−2)+...+a9f(x−10)x<10x>=10 - 给定 a 0 到 a 9 a_0 到 a_9 a0到a9 和两个正整数 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(x−1)...f(x−8)f(x−9)⎦⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎡a01...00a10...00...............a80...01a90...00⎦⎥⎥⎥⎥⎤⎣⎢⎢⎢⎢⎡f(x−1)f(x−2)...f(x−9)f(x−10)⎦⎥⎥⎥⎥⎤ - 继续化简后得到:
[ 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(x−1)...f(x−8)f(x−9)⎦⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎡a01...00a10...00...............a80...01a90...00⎦⎥⎥⎥⎥⎤x−9⎣⎢⎢⎢⎢⎡f(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...ak−1 和 数列 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=1∑kan−ibimod10000 - 给出 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} ⎣⎢⎢⎢⎢⎡anan−1...an−k+2an−k+1⎦⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎡b11000b20100...............bk−10001bk0000⎦⎥⎥⎥⎥⎤⎣⎢⎢⎢⎢⎡an−1an−2...an−k+1an−k⎦⎥⎥⎥⎥⎤mod10000=An−k+1⎣⎢⎢⎢⎢⎡ak−1ak−2...a1a0⎦⎥⎥⎥⎥⎤mod10000
- 直接上矩阵二分;
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=ai−1,j+ai,j−1(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=ai−1,j+ai,j−1(i,j>0)=(ai−2,j+ai−1,j−1)+ai,j−1=(ai−3,j+ai−2,j−1)+ai−1,j−1+ai,j−1...=a0,j+a1,j−1+...+ai−1,j−1+ai,j−1=a0,j+k=1∑iak,j−1
则有 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=1∑iak,m−1
其中 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,m−1+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,man−1,m...a1,ma0,m1⎦⎥⎥⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎢⎢⎡10...00011...000..................11...1001010...1010033...331⎦⎥⎥⎥⎥⎥⎥⎤⎣⎢⎢⎢⎢⎢⎢⎡an,m−1an−1,m−1...a1,m−1a0,m−11⎦⎥⎥⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎢⎢⎡10...00011...000..................11...1001010...1010033...331⎦⎥⎥⎥⎥⎥⎥⎤m−1⎣⎢⎢⎢⎢⎢⎢⎡an,1an−1,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=0∑n−1aibi
- 其中 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=ai−1AX+AYb0=B0,bi=bi−1BX+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=(ai−1AX+AY)(bi−1BX+BY)=AXBYai−1bi−1+AXBYai−1+AYBXbi−1+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)、anbn、an、bn、1;
[ 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⎦⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎡10000AXBXAXBX000AXBYAXBYAX00AYBXAYBX0BX0AYBYAYBYAYBY1⎦⎥⎥⎥⎥⎤⎣⎢⎢⎢⎢⎡S(n−1)an−1bn−1an−1bn−11⎦⎥⎥⎥⎥⎤
- 矩阵二分求解即可;
- 注意最后的答案 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(n−1)+2f(n−2)+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(n−1)n3n2n1⎦⎥⎥⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎢⎢⎡110000200000101000303100303210101111⎦⎥⎥⎥⎥⎥⎥⎤n−2⎣⎢⎢⎢⎢⎢⎢⎡f(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[n−1]+T[n−2]+T[n−3](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[n−1]T[n−2]⎦⎤=⎣⎡110101100⎦⎤⎣⎡T[n−1]T[n−2]T[n−3]⎦⎤ - 令 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[a−1],于是问题转化成求 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[n−1]T[n−2]⎦⎥⎥⎤=⎣⎢⎢⎡1000111011011100⎦⎥⎥⎤⎣⎢⎢⎡S[n−1]T[n−1]T[n−2]T[n−3]⎦⎥⎥⎤=⎣⎢⎢⎡1000111011011100⎦⎥⎥⎤n−2⎣⎢⎢⎡S[2]T[2]T[1]T[0]⎦⎥⎥⎤=An−2⎣⎢⎢⎡3111⎦⎥⎥⎤ - 对矩阵 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)=X∗A(n−1)+Y∗A(n−2)(n>=2) 求 S ( n ) = ∑ i = 0 n A ( i ) 2 S(n) = \sum_{i=0}^{n}A(i)^2 S(n)=i=0∑nA(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=(X∗A(n−1)+Y∗A(n−2))2=X2A(n−1)2+2XYA(n−1)A(n−2)+Y2A(n−2)2 - 所以要求 S ( n ) = S ( n − 1 ) + A ( n ) 2 S(n) = S(n-1) + A(n)^2 S(n)=S(n−1)+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)2、A(n)A(n−1)、A(n−1)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(n−1)A(n−1)2⎦⎥⎥⎤=⎣⎢⎢⎡1000X2X2X12XY2XYY0Y2Y200⎦⎥⎥⎤⎣⎢⎢⎡S(n−1)A(n−1)2A(n−1)A(n−2)A(n−2)2⎦⎥⎥⎤=⎣⎢⎢⎡1000X2X2X12XY2XYY0Y2Y200⎦⎥⎥⎤n−1⎣⎢⎢⎡S(1)A(1)2A(1)A(0)A(0)2⎦⎥⎥⎤=An−1⎣⎢⎢⎡2111⎦⎥⎥⎤ - 矩阵二分求解即可;
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)=⎩⎪⎨⎪⎧1C2C∗f(n−1)−f(n−2)(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=1∑nf(i)2 - 给定常数 C , n , m C,n,m C,n,m,求 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(n−1)f(n−1)2⎦⎥⎥⎤=⎣⎢⎢⎡10004C24C22C1−4C−4C−101100⎦⎥⎥⎤n−2⎣⎢⎢⎡1+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(k−1)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(k−1)I]=[AOAI]k−1[S(1)I]=Bk−1[AI] - 矩阵 B B B 的阶数为矩阵 A A A 的两倍,利用矩阵二分求解 B B B 的 k − 1 k-1 k−1 次幂后再乘上列向量,得到的列向量的上半部分就是所求的 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(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 , 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)⎦⎥⎥⎤=⎣⎢⎢⎡2110120110210112⎦⎥⎥⎤⎣⎢⎢⎡f(n−1,00)f(n−1,01)f(n−1,10)f(n−1,11)⎦⎥⎥⎤=An⎣⎢⎢⎡f(0,00)f(0,01)f(0,10)f(0,11)⎦⎥⎥⎤=An⎣⎢⎢⎡1000⎦⎥⎥⎤ - 矩阵二分求解;
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]=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]; - 将状态转移方程转换成矩阵表示,如下:
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]=AN∗⎣⎢⎢⎡1000⎦⎥⎥⎤ - 由于 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 fmf和fff,求这样的长度为 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 001、011、100、101、110、111,当往后添加一个字符的时候,考虑合法性,得到如下状态转移图:
- 构造状态转移矩阵如下:
[ 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 的状态都能进行状态转移,有状态转移图如下:
- 构造出系数矩阵如下:
[ 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 n−2 次幂,然后累加对应状态的和,再用 2^n 减去就是答案,注意取模的时候输出不能为负数,所以如果为负数需要再加上 MOD;
HDU 2276 Kiki & Little Kiki 2
链接:HDU 2276 Kiki & Little Kiki 2
题意:一个 01 循环串,长度小于为 L ( L < = 100 ) L(L<=100) L(L<=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(n−1,L)1−f(n−1,L)(f(n−1,L−1)=0)(f(n−1,L−1)=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(n−1,L−1)−f(n−1,L) - 由于 f ( n − 1 , L ) f(n−1,L) f(n−1,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(n−1,L−1)+f(n−1,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............00111001⎦⎥⎥⎤⎣⎢⎢⎡f(n−1,1)f(n−1,2)...f(n−1,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) (0≤k≤7)
- 问 当有 N ( N ≤ 1 0 9 ) N (N ≤ 10^9) N(N≤109) 个1的时候,最少多少步把它全部变成 0;
- 难度:★★★☆☆
- 题解:可以先利用 BFS 搜索出长度为前 8 的情况,发现有规律: 1 、 2 、 5 、 10 、 21 、 42 、 85 、 170 1、2、5、10、21、42、85、170 1、2、5、10、21、42、85、170,得到递推式如下:
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(n−1)2f(n−1)+1n为偶数n为奇数 - 根据奇偶性,再把公式化简得到:
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(n−2)+24f(n−2)+1n为偶数n为奇数 - 针对奇数和偶数的情况,构造两个矩阵如下:
偶 数 : [ 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(n−2)1]=Aen/2−1[20]=[4011][f(n−2)1]=Ao(n+1)/2−1[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 的行向量 就是答案了;