矩阵快速幂总结

矩阵快速幂

杭电培训总结,侵删

引导问题

一个有0和1组成的字符串,人和子串都不能包含 101 101 101 111 111 111,求满足要求的长度为 L ( 1 < = L < = 1 0 8 ) L(1<=L<=10^8) L(1<=L<=108)的字符串一共有多少,结果对 1 0 9 + 7 10^9+7 109+7求模。

思路:

f ( i ) f(i) f(i)为长度为 i i i的合法字符串的数量。

可知 f ( 1 ) = 2 f(1) = 2 f(1)=2 “1”,“0”

f ( 2 ) = 4 f(2)=4 f(2)=4 “00”,“01”,“10”,“11”

f ( 3 ) = 6 f(3)=6 f(3)=6 “000”,“001”,“010”,“011”,“100”,“101”,“110”,“111”

那么联想到 f ( n ) f(n) f(n),如果第 n n n位取 0 0 0,那么第 n − 1 n-1 n1位和 n − 2 n-2 n2位无论取什么,后三位也都不会构成 101 101 101或者 111 111 111。当第 n n n位确定为 0 0 0之后, f ( n ) = f ( n − 1 ) f(n)=f(n-1) f(n)=f(n1)

n n n位取 1 1 1,第 n − 1 n-1 n1位和 n − 2 n-2 n2位的组合有四种情况:00,01,1011。10和11不能取。10和11和最后的一位1会组成非法字符串101和111。所以又分了两种子情况,第 n − 1 n-1 n1位和 n − 2 n-2 n2位为00和第 n − 1 n-1 n1位和 n − 2 n-2 n2位01的。由于00和第 n − 3 n-3 n3位不会构成非法字符串,数量是 f ( n − 3 ) f(n-3) f(n3)。但是01情况下,如果第 n − 3 n-3 n3位为1的,会组成101的非法串,所以第 n − 3 n-3 n3位只能为0,由于第 n − 2 n-2 n2位和 n − 3 n-3 n3位的00不会构成非法串,该种情况数量为 f ( n − 4 ) f(n-4) f(n4)

递推公式为:
f ( n ) = f ( n − 1 ) + f ( n − 2 ) + f ( n − 4 ) f(n) = f(n-1) + f(n-2) + f(n-4) f(n)=f(n1)+f(n2)+f(n4)

矩阵乘法

//两个n行n列的矩阵相乘
const int maxn = 50;
int mat1[maxn][maxn], mat2[maxn][maxn];
int res[maxn][maxn];
for(int i=1;i<=n;++i)
    for(int j=1;j<=n;++j)
        for(int k=1;k<=n;++k)
            res[i][j] += mat1[i][k]*mat2[k][j];
	

斐波那契数列

f ( 0 ) = 0 , f ( n ) = f ( n − 1 ) + f ( n − 2 ) f(0)=0,f(n) = f(n-1)+f(n-2) f(0)=0f(n)=f(n1)+f(n2)

构造一个矩阵:

[ f [ n ] f [ n − 1 ] ] = [ 1 1 1 0 ] ∗ [ f [ n − 1 ] f [ n − 2 ] ] \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] [f[n]f[n1]]=[1110][f[n1]f[n2]]

设:

设 C ( n ) = [ f [ n ] f [ n − 1 ] ] B = [ 1 1 1 0 ] 设C(n)=\left[ \begin{matrix} f[n]\\ f[n-1] \end{matrix} \right] \\ B = \left[ \begin{matrix} 1 & 1\\ 1 & 0 \end{matrix} \right] C(n)=[f[n]f[n1]]B=[1110]

等价于
C ( n ) = B ∗ C ( n − 1 ) = B ∗ B ∗ C ( n − 2 ) = B n − 1 ∗ C ( 1 ) C(n) = B * C(n-1) \\ = B * B * C(n-2) \\ = B^{n-1}*C(1) C(n)=BC(n1)=BBC(n2)=Bn1C(1)

①任意一个形如 f ( n ) = a ∗ f ( n − 1 ) + b ∗ f ( n − 2 ) f(n)=a*f(n-1)+b*f(n-2) f(n)=af(n1)+bf(n2)

构 造 矩 阵 : [ f [ n ] f [ n − 1 ] ] = [ a b 1 0 ] ∗ [ f [ n − 1 ] f [ n − 2 ] ] 构造矩阵:\left[ \begin{matrix} f[n]\\ f[n-1] \end{matrix} \right] = \left[ \begin{matrix} a & b\\ 1 & 0 \end{matrix} \right] * \left[ \begin{matrix} f[n-1]\\ f[n-2] \end{matrix} \right] [f[n]f[n1]]=[a1b0][f[n1]f[n2]]

例如 f ( n ) = 3 ∗ f ( n − 1 ) + 5 ∗ f ( n − 3 ) + 9 ∗ f ( n − 4 ) f(n)=3*f(n-1)+5*f(n-3)+9*f(n-4) f(n)=3f(n1)+5f(n3)+9f(n4)

构造:
[ f [ n ] f [ n − 1 ] f [ n − 2 ] f [ n − 3 ] ] = [ 3 0 5 9 1 0 0 0 0 1 0 0 0 0 1 0 ] ∗ [ f [ n − 1 ] f [ n − 2 ] f [ n − 3 ] f [ n − 4 ] ] \left[ \begin{matrix} f[n]\\ f[n-1]\\ f[n-2]\\ f[n-3] \end{matrix} \right] = \left[ \begin{matrix} 3 & 0 & 5 & 9\\ 1&0&0&0\\ 0&1&0&0\\ 0&0&1&0 \end{matrix} \right] * \left[ \begin{matrix} f[n-1]\\ f[n-2]\\ f[n-3]\\ f[n-4] \end{matrix} \right] f[n]f[n1]f[n2]f[n3]=3100001050019000f[n1]f[n2]f[n3]f[n4]

f ( n ) = a ∗ f ( n − 1 ) + b ∗ f ( n − 3 ) + c f(n)=a*f(n-1)+b*f(n-3)+c f(n)=af(n1)+bf(n3)+c

[ f [ n ] f [ n − 1 ] f [ n − 2 ] 1 ] = [ a 0 b c 1 0 0 0 0 1 0 0 0 0 0 1 ] ∗ [ f [ n − 1 ] f [ n − 2 ] f [ n − 3 ] 1 ] \left[ \begin{matrix} f[n]\\ f[n-1]\\ f[n-2]\\ 1 \end{matrix} \right] = \left[ \begin{matrix} a&0&b&c\\ 1&0&0&0\\ 0&1&0&0\\ 0&0&0&1 \end{matrix} \right] * \left[ \begin{matrix} f[n-1]\\ f[n-2]\\ f[n-3]\\ 1 \end{matrix} \right] f[n]f[n1]f[n2]1=a1000010b000c001f[n1]f[n2]f[n3]1

或者
[ f [ n ] f [ n − 1 ] f [ n − 2 ] c ] = [ a 0 b 1 1 0 0 0 0 1 0 0 0 0 0 1 ] ∗ [ f [ n − 1 ] f [ n − 2 ] f [ n − 3 ] c ] \left[ \begin{matrix} f[n]\\ f[n-1]\\ f[n-2]\\ c \end{matrix} \right] = \left[ \begin{matrix} a&0&b&1\\ 1&0&0&0\\ 0&1&0&0\\ 0&0&0&1 \end{matrix} \right] * \left[ \begin{matrix} f[n-1]\\ f[n-2]\\ f[n-3]\\ c \end{matrix} \right] f[n]f[n1]f[n2]c=a1000010b0001001f[n1]f[n2]f[n3]c

f ( 1 ) = 1 , f ( 2 ) = 2 , f ( n ) = f ( n − 1 ) + 2 f ( n − 2 ) + n 3 f(1)=1,f(2)=2,f(n)=f(n-1)+2f(n-2)+n^3 f(1)=1,f(2)=2,f(n)=f(n1)+2f(n2)+n3

根据二项式定理 n 3 n^3 n3拆分为 n 3 = ( n − 1 + 1 ) 3 = ( n − 1 ) 3 + 3 ( n − 1 ) 2 + 3 ( n − 1 ) + 1 n^3=(n-1+1)^3=(n-1)^3+3(n-1)^2+3(n-1)+1 n3=(n1+1)3=(n1)3+3(n1)2+3(n1)+1

那么 n 2 = ( n − 1 ) 2 + 2 ( n − 1 ) + 1 n^2=(n-1)^2+2(n-1)+1 n2=(n1)2+2(n1)+1

f ( n ) = f ( n − 1 ) + 2 f ( n − 2 ) + n 3 = f ( n − 1 ) + 2 f ( n − 2 ) + ( n − 1 ) 3 + 3 ( n − 1 ) 2 + 3 ( n − 1 ) + 1 f(n)\\=f(n-1)+2f(n-2)+n^3 \\=f(n-1)+2f(n-2)+(n-1)^3+3(n-1)^2+3(n-1)+1 f(n)=f(n1)+2f(n2)+n3=f(n1)+2f(n2)+(n1)3+3(n1)2+3(n1)+1
[ 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 ] ∗ [ f [ n − 1 ] f [ n − 2 ] ( n − 1 ) 3 ( n − 1 ) 2 ( n − 1 ) 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] * \left[ \begin{matrix} f[n-1]\\ f[n-2]\\ (n-1)^3\\ (n-1)^2\\(n-1)\\1 \end{matrix} \right] f[n]f[n1]n3n2n1=110000200000101000303100303210101111f[n1]f[n2](n1)3(n1)2(n1)1
例如: f ( n ) = f ( n − 1 ) + 2 f ( n − 2 ) + n 3 + n 2 f(n)=f(n-1)+2f(n-2)+n^3+n^2 f(n)=f(n1)+2f(n2)+n3+n2
[ f [ n ] f [ n − 1 ] n 3 n 2 n 1 ] = [ 1 2 1 4 5 2 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 ] ∗ [ f [ n − 1 ] f [ n − 2 ] ( n − 1 ) 3 ( n − 1 ) 2 ( n − 1 ) 1 ] \left[ \begin{matrix} f[n]\\ f[n-1]\\ n^3\\ n^2 \\n\\1 \end{matrix} \right] = \left[ \begin{matrix} 1&2&1&4&5&2\\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] * \left[ \begin{matrix} f[n-1]\\ f[n-2]\\ (n-1)^3\\ (n-1)^2\\(n-1)\\1 \end{matrix} \right] f[n]f[n1]n3n2n1=110000200000101000403100503210201111f[n1]f[n2](n1)3(n1)2(n1)1

二项式定理:
( x + y ) n = ( n 0 ) x n y 0 + ( n 1 ) x n − 1 y 1 + ( n 2 ) x n − 2 y 2 + . . . + ( n n − 1 ) x 1 y n − 1 + ( n n ) x 0 y n ( x + y ) n = ∑ k = 0 n ( n k ) x n − k y k = ∑ k = 0 n ( n k ) x k y n − k (x+y)^n= \left( \begin{matrix} n\\ 0 \end{matrix} \right)x^ny^0+ \left( \begin{matrix} n\\1 \end{matrix} \right)x^{n-1}y^1+ \left( \begin{matrix} n\\2 \end{matrix} \right)x^{n-2}y^2+ ...+ \left( \begin{matrix} n\\n-1 \end{matrix} \right)x^{1}y^{n-1}+ \left( \begin{matrix} n\\n \end{matrix} \right)x^{0}y^{n} \\ \\ \\ (x+y)^n= \sum_{k=0}^n\left( \begin{matrix} n\\k \end{matrix} \right)x^{n-k}y^{k} = \sum_{k=0}^n\left( \begin{matrix} n\\k \end{matrix} \right)x^{k}y^{n-k} (x+y)n=(n0)xny0+(n1)xn1y1+(n2)xn2y2+...+(nn1)x1yn1+(nn)x0yn(x+y)n=k=0n(nk)xnkyk=k=0n(nk)xkynk



④包含前缀和

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 a a b b b ( 1 < = a < = b < = 1 0 9 ) (1<=a<=b<=10^9) (1<=a<=b<=109),求 ( T [ a ] + T [ a + 1 ] + . . . + T [ b ] ) % ( 1 0 9 + 7 ) (T[a]+T[a+1]+...+T[b])\%(10^9+7) (T[a]+T[a+1]+...+T[b])%(109+7)

思路: 前 缀 和 S [ n ] = S [ n − 1 ] + T [ n ] S [ n ] = S [ n − 1 ] + T [ n − 1 ] + T [ n − 2 ] + T [ n − 3 ] 前缀和\\S[n]=S[n-1]+T[n] \\S[n]=S[n-1]+T[n-1]+T[n-2]+T[n-3] S[n]=S[n1]+T[n]S[n]=S[n1]+T[n1]+T[n2]+T[n3]

构造矩阵:
[ 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 ] ] \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] S[n]T[n]T[n1]T[n2]=1000111011011100S[n1]T[n1]T[n2]T[n3]



⑤前缀平方和

A [ 0 ] = 1 A[0]=1 A[0]=1, A [ 1 ] = 1 A[1]=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 ] = ∑ 0 n A [ i ] 2 S[n]=\sum_0^nA[i]^2 S[n]=0nA[i]2

分析:

S [ n ] = s [ n − 1 ] + A [ n ] 2 S[n]=s[n-1]+A[n]^2 S[n]=s[n1]+A[n]2

A [ n ] 2 = X 2 ∗ A [ n − 1 ] 2 + Y 2 ∗ A [ n − 2 ] 2 + 2 X Y ∗ A [ n − 1 ] A [ n − 2 ] A[n]^2=X^2*A[n-1]^2+Y^2*A[n-2]^2+2XY*A[n-1]A[n-2] A[n]2=X2A[n1]2+Y2A[n2]2+2XYA[n1]A[n2]

A [ n ] 乘 以 A [ n − 1 ] : A [ n ] = X ∗ A [ n − 1 ] + Y ∗ A [ n − 2 ] = > A [ n ] A [ n − 1 ] = X ∗ A [ n − 1 ] 2 + Y ∗ A [ n − 2 ] A [ n − 1 ] A[n]乘以A[n-1] : A[n]=X*A[n-1]+Y*A[n-2] => A[n]A[n-1]=X*A[n-1]^2+Y*A[n-2]A[n-1] A[n]A[n1]:A[n]=XA[n1]+YA[n2]=>A[n]A[n1]=XA[n1]2+YA[n2]A[n1]
[ S [ n ] A [ n ] 2 A [ n − 1 ] 2 A [ n ] A [ n − 2 ] ] = [ 1 X 2 Y 2 2 X Y 0 X 2 Y 2 2 X Y 0 1 0 0 0 X 0 Y ] [ S [ n − 1 ] A [ n − 1 ] 2 A [ n − 2 ] 2 A [ n − 1 ] A [ n − 2 ] ] \left[ \begin{matrix} S[n]\\A[n]^2\\A[n-1]^2\\A[n]A[n-2] \end{matrix} \right] = \left[ \begin{matrix} 1&X^2&Y^2&2XY\\0&X^2&Y^2&2XY\\0&1&0&0\\0&X&0&Y \end{matrix} \right] \left[ \begin{matrix} S[n-1]\\A[n-1]^2\\A[n-2]^2\\A[n-1]A[n-2] \end{matrix} \right] S[n]A[n]2A[n1]2A[n]A[n2]=1000X2X21XY2Y2002XY2XY0YS[n1]A[n1]2A[n2]2A[n1]A[n2]

例题

一个 01 01 01循环串,长度为 L ( L < = 100 ) L(L<=100) L(L<=100),这个串每秒都会进行一次变换,变换规则是:如果左边是1,则改变自己的状态,否则保持不变。
给定初始状态,问 n n 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)           (f(n1,L1)=0)1f(n1,L)    (f(n1,L1)=1)
简化:

如果 f ( n − 1 , L − 1 ) = 0 f(n-1,L-1)=0 f(n1,L1)=0; f ( n − 1 , L ) = f ( n − 1 , L ) + 0 = f ( n − 1 , L ) + f ( n − 1 , L − 1 ) f(n-1,L)=f(n-1,L) + 0 = f(n-1,L)+f(n-1,L-1) f(n1,L)=f(n1,L)+0=f(n1,L)+f(n1,L1)

如果 f ( n − 1 , L − 1 ) = 1 f(n-1,L-1)=1 f(n1,L1)=1; 1 − f ( n − 1 , L ) = f ( n − 1 , L − 1 ) − f ( n − 1 , L ) 1-f(n-1,L)=f(n-1,L-1)-f(n-1,L) 1f(n1,L)=f(n1,L1)f(n1,L)

由于取值只有0和1,那么1+1=0

化简为 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)

矩阵快速幂模板

const int maxn = 12; //最大矩阵规模
int mod = 9973; //模数
int n; //矩阵规模
//矩阵结构体
struct mat {
	int m[maxn][maxn];
	mat() //构造函数 单位矩阵 
	{ 
		memset(m,0,sizeof m);
		for (int i=1;i<=n;++i)
			m[i][i] = 1;
	}
    //[]运算符重载
	int* operator[] (int index)
	{
		return m[index];
	}
    //矩阵乘法
	mat operator*(mat& a)
	{
		mat res;
		for(int i=1;i<=n;++i)
		{
			for(int j=1;j<=n;++j)
			{
				res[i][j]=0;
				for(int k=1;k<=n;++k)
					res[i][j] = (res[i][j] + m[i][k] * a[k][j] % mod) % mod;
			}
		}
		return res;
	}
};

//快速幂
mat fastpow(mat a,int b)
{
	mat res;
	while(b) 
	{
		if(b&1) res = res * a;
		a = a * a;
		b >>= 1;
	}
	return res;
}
int main()
{
    /*Code*/
    return 0;
}
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值