文章目录
- 一、矩阵快速幂 算法讲解
- 二、矩阵快速幂 解题报告
- HDU 3658 How many words
- HDU 6030 Happy Necklace
- HDU 1588 Gauss Fibonacci
- HDU 3936 FIB Query
- HDU 2254 奥运
- HDU 5607 graph
- HDU 3292 No more tricks, Mr Nanguo
- HDU 2256 Problem of Precision
- HDU 4549 M斐波那契数列
- HDU 5895 Mathematician QSC
- HDU 2238 机器人的舞蹈II
- HDU 2855 Fibonacci Check-up
- HDU 3509 Buge's Fibonacci Number Problem
- HDU 3483 A Very Simple Problem
- HDU 4291 A Short problem
- HDU 5451 Best Solver
- HDU 1977 Odd Loving Bakers
- HDU 5986 Fibonacci
- HDU 6755 Fibonacci Sum
- HDU 4959 Poor Akagi
一、矩阵快速幂 算法讲解
夜深人静写算法(二十)矩阵快速幂
二、矩阵快速幂 解题报告
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,所以有状态转移如下:
- 2)如果一个字符串以 aA 结尾,那么后面只能跟 A,因为 3是素数,不能出现 aAa,所以有状态转移如下:
- 3)如果一个字符串以 aAA 结尾,那么后面可以跟 a,也可以跟 A,原因是以 aAA 结尾的字符串要么就是 aAA 要么一定也是以AaAA 结尾的(因为不可能出现 aaAA),所以有状态转移;
- 4)最后来看 aAAA 和 AAA 的状态其实是一样的,所以可以进行状态合并,并且可以得出 AAA 的状态转移如下:
- 5)最后将所有状态组合在一个图上,得到一个状态转移图如下:
- 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
-
题意:
-
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(n−1)+f(n−2)(n>=2)
-
2) g ( i ) = k ∗ i + b g(i)=k*i+b g(i)=k∗i+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 ∑in−1f(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(n−1)]=[1110][f(n−1)f(n−2)]=[1110]n−1[f(1)f(0)]=An−1[10] -
所以求 f ( g ( i ) ) = f ( k ∗ i + b ) f(g(i)) = f(k*i+b) f(g(i))=f(k∗i+b),就是求 A k ∗ i + b − 1 A^{k*i+b-1} Ak∗i+b−1,那么求和 ∑ i = 0 n − 1 f ( g ( i ) ) \sum_{i=0}^{n-1}{f(g(i))} ∑i=0n−1f(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=Ab−1+Ak+b−1+A2k+b−1+...+A(n−1)k+b−1=Ab−1∗(A0+Ak+A2k+...+A(n−1)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((n−1)k)I]=[AkOAkI]n−1[S(k)I]=Sn−1[AkI] -
所以,依次求出 A k A^k Ak、 S S S、 S n − 2 S^{n-2} Sn−2、 S ( ( n − 1 ) k ) S((n-1)k) S((n−1)k)、 A b − 1 A^{b-1} Ab−1、 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=0、1、2;b=0; 等情况都需要进行特殊处理;
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(n−1)+f(n−2)(n>=2)
-
2) g ( i ) = 4 ∗ i − 1 g(i)=4*i-1 g(i)=4∗i−1
-
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 L∑Rf(g(i))%1000000007=(1∑Rf(g(i))−1∑L−1f(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(n−1)]=[1110][f(n−1)f(n−2)]=[1110]n−1[f(1)f(0)]=An−1[10] -
所以求 f ( g ( i ) ) = f ( 4 ∗ i − 1 ) f(g(i)) = f(4*i-1) f(g(i))=f(4∗i−1),就是求 A 4 ∗ i − 2 A^{4*i-2} A4∗i−2,那么求和 ∑ 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=A4∗1−2+A4∗2−2+A4∗3−2+...+A4∗n−2=A2∗(A4∗0+A4∗1+A4∗2+...+A4∗(n−1))
令 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((n−1)k)I]=[AkOAkI]n−1[S(k)I]=Sn−1[AkI] -
所以,依次求出 A 4 A^4 A4、 S S S、 S n − 2 S^{n-2} Sn−2、 S ( ( n − 1 ) k ) S((n-1)k) S((n−1)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=0、1、2;b=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(n−1,u) - 举个例子,有向图如下:
- 这个图的邻接矩阵如下(
A
[
u
]
[
v
]
表
示
u
到
v
有
多
少
条
边
A[u][v] 表示 u 到 v 有多少条边
A[u][v]表示u到v有多少条边):
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)⎦⎤=⎣⎡011100000⎦⎤⎣⎡f(n−1,0)f(n−1,1)f(n−1,2)⎦⎤ - 观察发现 系数矩阵 和 正好是 邻接矩阵 的 转置,于是根据邻接矩阵建立反图;令系数矩阵为A,顶点数为 m,从
v
1
点
到
v
2
v_1 点到 v_2
v1点到v2 点经过
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,m−1)⎦⎥⎥⎥⎥⎥⎥⎤=An−1⎣⎢⎢⎢⎢⎢⎢⎡f(1,0)f(1,1)...f(1,v1)...f(1,m−1)⎦⎥⎥⎥⎥⎥⎥⎤ - 其中 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(t1−1);于是问题转换成求矩阵 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(n−1)I]=[AOAI]n[OI]=A′n[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.
- 难度:★★★☆☆
- 题解:直接举例更加直观;对于如下的有向图:
- 建立矩阵如下:
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+1(X,Y>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+NYk=(X1+NY1)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+NYk=(Xk−1+NYk−1)(X1+NY1)=(X1Xk−1+NY1Yk−1)+N(X1Yk−1+Y1Xk−1) - 得到递推矩阵如下:
[ 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][Xk−1Yk−1]=Ak−1[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)n⌋mod1024
- 难度:★★★☆☆
- 题解:首先令
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=(An−1+Bn−16)(5+26)=(5An−1+12Bn−1)+(2An−1+5Bn−1)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][An−1Bn−1]=[52125]n−1[52]
又由于 ( 5 + 2 6 ) ( 5 − 2 6 ) = 1 (5+2\sqrt{6})(5-2\sqrt{6})=1 (5+26)(5−26)=1,得到 ( 5 + 2 6 ) n ( 5 − 2 6 ) n = 1 (5+2\sqrt{6})^n(5-2\sqrt{6})^n=1 (5+26)n(5−26)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)(An−Bn6)=1,得到:
6 B n 2 = A n 2 − 1 6B_n^2 = A_n^2 - 1 6Bn2=An2−1,从而推导出 B n 6 = A n 2 − 1 B_n\sqrt{6} = \sqrt{A_n^2 - 1} Bn6=An2−1,于是 B n 6 B_n\sqrt{6} Bn6 的整数部分就是 A n − 1 A_n-1 An−1,所以我们要求的答案就是 ( 2 A n − 1 ) % 1024 (2A_n-1) \% 1024 (2An−1)%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(n−1)∗F(n−2)(n>1)
-
给定 a 、 b 、 n ( n < = 1 0 9 ) a、b、n(n <=10^9) a、b、n(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(n−2)bf(n−1),其中 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(n−1)+f(n−2),即斐波那契数列;
-
令 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)=1,b<φ(c)gcd(a,c)=1,b>=φ(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)=⎩⎪⎨⎪⎧012∗f(n−1)+f(n−2)(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=0∑nf(i)2
给出
n
、
y
、
x
、
s
n、y、x、s
n、y、x、s 求:
x
g
(
n
∗
y
)
%
(
s
+
1
)
x^{g(n*y)} \% (s+1)
xg(n∗y)%(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(n−1)]=[2110][f(n−1)f(n−2)]
那么如何构造 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(n−1)2+4f(n−1)f(n−2)+f(n−2)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(n−1)f(n−1)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(n−1)f(n−1)2⎦⎤=⎣⎡421410100⎦⎤⎣⎡f(n−1)2f(n−1)f(n−2)f(n−2)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(n−1)f(n−1)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(n−1)f(n−1)2⎦⎥⎥⎤=⎣⎢⎢⎡1000442144101100⎦⎥⎥⎤⎣⎢⎢⎡sum(n−1)f(n−1)2f(n−1)f(n−2)f(n−2)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(n−1)f(n−1)2⎦⎥⎥⎤=⎣⎢⎢⎡1000442144101100⎦⎥⎥⎤n−1⎣⎢⎢⎡1100⎦⎥⎥⎤
根据扩展欧拉定理,有
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)=1,b<φ(c)gcd(a,c)=1,b>=φ(c)
然后直接套公式,矩阵二分求解;
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[step−1][p0][p1][p2][p3](pi和si相邻)
将后面四维状态编码到 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=0∑nCnkF(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(n−1)F(n−1)F(n−2)]
- 令
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(n−1)+bF(n−2)
- 给定 f 1 、 f 2 、 a 、 b 、 n , m , k ( k < = 50 ) f_1、f_2、a、b、n,m,k(k <= 50) f1、f2、a、b、n,m,k(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(n−1)+bF(n−2)]k=Ck0[aF(n−1)]k+Ck1[aF(n−1)]k−1[bF(n−2)]+...+Ckk[aF(n−1)]0[bF(n−2)]k=Ck0akG(n−1,k)+Ck1ak−1bG(n−1,k−1)G(n−2,1)+...+Ckka0bkG(n−1,0)G(n−2,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,k−1)G(n−1,1)...G(n,1)G(n−1,k−1)G(n,0)G(n−1,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,k−1)G(n−1,1)...G(n,1)G(n−1,k−1)G(n,0)G(n−1,k)⎦⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎡Ck0akCk−10ak−1...C10a1b0C00a0b0Ck1ak−1bCk−11ak−2b1...C11a0b10...............Ckk−1a1bk−1Ck−1k−1ak−1b0...00Ckka0bk0...00⎦⎥⎥⎥⎥⎤⎣⎢⎢⎢⎢⎡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)⎦⎥⎥⎥⎥⎤=An−2⎣⎢⎢⎢⎢⎡G(2,k)G(2,k−1)G(1,1)...G(2,1)G(1,k−1)G(2,0)G(1,k)⎦⎥⎥⎥⎥⎤=An−2⎣⎢⎢⎢⎢⎡f2kf2k−1f1...f21f1k−1f20f1k⎦⎥⎥⎥⎥⎤
- 这里的矩阵
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 Ck−ijak−i−jbj - 令 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,k−1)G(n−1,1)...G(n,1)G(n−1,k−1)G(n,0)G(n−1,k)⎦⎥⎥⎥⎥⎥⎥⎤=[10BA]n−2⎣⎢⎢⎢⎢⎢⎢⎡f1k+f2kf2kf2k−1f1...f21f1k−1f20f1k⎦⎥⎥⎥⎥⎥⎥⎤
- 其中 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 1≤N,M≤2×109,1≤x≤50,求最后的值;
- 难度:★★★★☆
- 题解:令
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
N−1 和
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=[(N−1)+1]xaN=[Cx0(N−1)x+Cx1(N−1)x−1+...+Cxx−1(N−1)1+Cxx(N−1)0]aN=aNCx0(N−1)x+aNCx1(N−1)x−1+...+aNCxx−1(N−1)1+aNCxx(N−1)0=aCx0(N−1)xaN−1+aCx1(N−1)x−1aN−1+...+aCxx−1(N−1)1aN−1+aCxx(N−1)0aN−1=aCx0f(N−1,x,a)+aCx1f(N−1,x−1,a)+...+aCxx−1f(N−1,1,a)+aCxxf(N−1,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,x−1,a)...f(N,1,a)f(N,0,a)⎦⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎡aCx00...00aCx1aCx−10...00...............aCxx−1aCx−1x−2...aC100aCxxaCx−1x−1...aC11aC00⎦⎥⎥⎥⎥⎤⎣⎢⎢⎢⎢⎡f(N−1,x,a)f(N−1,x−1,a)...f(N−1,1,a)f(N−1,0,a)⎦⎥⎥⎥⎥⎤=AN−1⎣⎢⎢⎢⎢⎡f(1,x,a)f(1,x−1,a)...f(1,1,a)f(1,0,a)⎦⎥⎥⎥⎥⎤=AN−1⎣⎢⎢⎢⎢⎡aa...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,x−1,a)...f(N,1,a)f(N,0,a)⎦⎥⎥⎥⎥⎥⎥⎤=[10BA]⎣⎢⎢⎢⎢⎢⎢⎡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)⎦⎥⎥⎥⎥⎥⎥⎤=[10BA]N−1⎣⎢⎢⎢⎢⎢⎢⎡aaa...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)=0,g(1)=1,g(n)=3g(n−1)+g(n−2),求 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(n−1)]=[3110]n−1[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))mod222222224−1[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)mod183120−1[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(M≤46337), 求 [ 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
An和Bn 的递推关系如下:
[ 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][An−1Bn−1]=[52125]n−1[52]
又由于 ( 5 + 2 6 ) ( 5 − 2 6 ) = 1 (5+2\sqrt{6})(5-2\sqrt{6})=1 (5+26)(5−26)=1,得到 ( 5 + 2 6 ) n ( 5 − 2 6 ) n = 1 (5+2\sqrt{6})^n(5-2\sqrt{6})^n=1 (5+26)n(5−26)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)(An−Bn6)=1,得到:
6 B n 2 = A n 2 − 1 6B_n^2 = A_n^2 - 1 6Bn2=An2−1,从而推导出 B n 6 = A n 2 − 1 B_n\sqrt{6} = \sqrt{A_n^2 - 1} Bn6=An2−1,于是 B n 6 B_n\sqrt{6} Bn6 的整数部分就是 A n − 1 A_n-1 An−1,所以给定 x x x 的值,我们要求的就是 ( 2 A 2 x + 1 − 1 ) % M (2A_{2^x+1} - 1) \% M (2A2x+1−1)%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+M−1)%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
t−1 次的标记值,有状态转移方程如下:
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(t−1,i)+j=0∑n−1e(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(t−1,j)mod2=1 - 第
t
−
1
t-1
t−1 次 和 第
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,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)%2f(t−1,1)%2...f(t−1,n−2)%2f(t−1,n−1)%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(t−1,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,n−2)%2f(t,n−1)%2⎦⎥⎥⎥⎥⎤=(E+A)⎣⎢⎢⎢⎢⎡f(t−1,0)%2f(t−1,1)%2...f(t−1,n−2)%2f(t−1,n−1)%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,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
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(n−1)+f(n−2)(n≥2)x(n)=f(x(n−1)) 给定 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
i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
f(i) | 0 | 1 | 1 | 2 | 3 | 5 | 8 | 13 | 21 | 34 | 55 | 89 | 144 | 233 | 377 | 610 | 987 | 1597 | 2584 |
f(i)%1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
f(i)%2 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 0 |
f(i)%3 | 0 | 1 | 1 | 2 | 0 | 2 | 2 | 1 | 0 | 1 | 1 | 2 | 0 | 2 | 2 | 1 | 0 | 1 | 1 |
f(i)%4 | 0 | 1 | 1 | 2 | 3 | 1 | 0 | 1 | 1 | 2 | 3 | 1 | 0 | 1 | 1 | 2 | 3 | 1 | 0 |
-
如上图所示, 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(n−1))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(n−1)modKp)modp,而因为 p p p 不大,所以这里的循环节可以通过枚举得出;
-
于是问题转化成求 x ( n − 1 ) m o d K p x(n-1) \mod K_p x(n−1)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(n−1)modKp=f(x(n−2)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(Pi−1)Pm−1i=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} F0到Fm−1 计算可以采用枚举法; F m 到 F n F_m 到 F_n Fm到Fn 计算过程中,模数都是 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=0∑Nf(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)=51[(21+5)n−(21−5)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=21−5,
z
=
1
5
z=\frac{1}{\sqrt {5} }
z=51,将原公式化简为:
f ( n ) = z [ x n − y n ] f(n) = z [ x^n - y^n] f(n)=z[xn−yn],通过代入 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[xiC−yiC]}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[xiC−yiC]}K=zK[xiC−yiC]K=zK[CK0xiCK(−1)0+CK1xiC(K−1)(−1)1yiC+...+CKK(−1)KyiCK]=zKj=0∑KCKjxiC(K−j)(−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=0∑Nf(iC)Kmod1000000009=zKi=0∑N[j=0∑KCKjxiC(K−j)(−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(K−j)(−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=0∑N[j=0∑KCKjxiC(K−j)(−1)jyiCj]=zKj=0∑K[i=0∑NCKjxiC(K−j)(−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(K−j)(−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(i−1)Gj(i)=CKjx(i−1)C(K−j)(−1)jy(i−1)CjCKjxiC(K−j)(−1)jyiCj=xC(K−j)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=0∑Nf(iC)Kmod1000000009=zKj=0∑Ki=0∑NGj(i)mod1000000009=zKj=0∑K[(−1)jCKjqj−1qjN+1−1]mod1000000009 - 对于二次剩余,我们可以通过枚举求出最小的
X
X
X(我的机子大概 5 秒硬算出来) :
X 2 ≡ 5 ( m o d 1000000009 ) X = 383008016 X^2 \equiv 5 (\mod 1000000009) \\ X = 383008016 X2≡5(mod1000000009)X=383008016 - 那么就能够得到:
383008016 ≡ 5 ( m o d 1000000009 ) 383008016 \equiv \sqrt5 (\mod 1000000009) 383008016≡5(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=21−5,
z
=
1
5
z=\frac{1}{\sqrt {5} }
z=51,所以现在需要求这三者模上
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) 276601605≡5−1(mod1000000009)500000005≡2−1(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=21−5=(1−383008016)∗500000005(mod1000000009)=308495997z=51=5−1(mod1000000009)=276601605 - 由于 q j = x C ( K − j ) y C j q_j = x^{C(K-j)}y^{Cj} qj=xC(K−j)yCj,利用二分快速幂求解得出 q j q_j qj,再求 q j − 1 q_j - 1 qj−1的逆元,从而求得 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={1CKj−1jK−j+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 a−1≡ap−2modp;
- 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 ab≡abmodp−1modp;
- 5) q j = x C ( K − j ) y C j q_j = x^{C(K-j)}y^{Cj} qj=xC(K−j)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=qj−1xCyC;
- 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(n−1)+L(n−2)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+(21−5)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=21−5,则有 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(k−1)qn+...+Ckk−1pnqn(k−1)+Ckkqnk=j=0∑kCkjpn(k−j)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=0∑nL(i)k=i=0∑nj=0∑kCkjpi(k−j)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=0∑nL(i)k=j=0∑kCkji=0∑npi(k−j)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!(k−j)!k!=j(j−1)!(k−j+1)!k!(k−j+1)=jk−j+1Ckj−1
- 由于 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=0∑npi(k−j)qij
- 令 a ( i ) = [ p k − j q j ] i a(i) = [ p^{k-j}q^{j} ]^i a(i)=[pk−jqj]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)=[pk−jqj]i=[(21+5)k−j(21−5)j]i=[2−k(1+5)k−j(1−5)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⎦⎤=⎣⎡100XXY5Y5YX⎦⎤n⎣⎡110⎦⎤
- 利用矩阵二分求解 s ( i ) X s(i)_X s(i)X 再乘上 C k j C_k^j Ckj 加和就是答案了。