矩阵乘法学习笔记

经历了一发被虐以后,我发现我对矩阵乘法一无所知...

于是开始补坑QAQ

感觉矩乘貌似写起来不是很麻烦就不放代码了(其实是你懒得写)

一、基础

大体过程

A*B=C —> C_{i,j}=A_{i,k}*B_{k,j}

我一般的理解方式就是我们在第一个矩阵框一行,然后在第二个矩阵框一列,然后他们的交点的地方就是我们放值的地方。

这个样子(?)

 

 

矩阵乘法的基本性质

1.满足结合律->这也是我们可以矩阵快速幂计算答案的基础

2.不满足交换律,这很显然因为交换以后行列数会变化,然而矩阵乘法要求第一个矩阵的列数等于第二个矩阵的行数,所以不满足交换律。

我现在的水平大概用这些就够了(?)以后再补坑

二、例题

当然是我们最常规的求斐波那契数列第K项啦

首先我们写出递推式F(n)=F(n-1)+F(n-2)

然后我们观察递推式有两项,我们可以用一个2*2的矩阵来写出来

\begin{bmatrix} F_n & F_{n-1}\\ F_{n-2} & F_{n-3} \end{bmatrix} *\begin{bmatrix} 1 &1\\1 & 0 \end{bmatrix} =\begin{bmatrix} F_n+F_{n-1} & F_n\\ F_{n-2}+F_{n-3} & F_{n-2} \end{bmatrix}

我们把最后一个矩阵的式子化一下就是\begin{bmatrix} F_{n+1} & F_n\\ F_{n-1} & F_{n-2} \end{bmatrix}

是不是就是我们想要的式子!!!

然后我们用快速幂的方法处理第二个矩阵的k-2次幂第一项就是我们的答案啦

由于笔者水平有限...只会凑数凑矩阵...emm...如果在读这个傻傻的blog的你会更好的办法那么请私信我或者评论!!谢谢orz

三、练习

笔者从网上搜罗到的一点题...水平有限求轻喷QAQ

1.CodeVS1281 Xn数列

给你6个数,m, a, c, x0, n, g

Xn+1 = ( aXn + c ) mod m,求Xn

m, a, c, x0, n, g<=10^18

应该也是经典题吧(?)我不会QAQ看了一发hzwer学长的题解发现随便构造一下就可以了QAQ

\begin{bmatrix} X_n &C \end{bmatrix}*\begin{bmatrix} A & 0\\ 1 & 1 \end{bmatrix}=\begin{bmatrix}A*X_n+C & C\end{bmatrix}

同样后面的式子化简一发就是\begin{bmatrix} X_{n+1} & C\end{bmatrix}

依然可以矩阵快速幂搞定

2.CH30 摆花

背景及描述

艺术馆门前将摆出许多花,一共有n个位置排成一排,每个位置可以摆花也可以不摆花。有些花如果摆在相邻的位置(隔着一个空的位置不算相邻),就不好看了。假定每种花数量无限,求摆花的方案数。

输入格式

输入有1+m行,第一行有两个用空格隔开的正整数n、m,m表示花的种类数。接下来的m行,每行有m个字符1或0,若第i行第j列为1,则表示第i种花和第j种花不能排在相邻的位置,输入保证对称。(提示:同一种花可能不能排在相邻位置)。

输出格式

输出只有一个整数,为方案数(这个数字可能很大,请输出方案数除以1000000007的余数)。

还是经典题QwQ依然不会做emm通过这个题找到了一点手感吧QwQ

我们先写出DP转移方程f_{i,j}=\sum f_{i-1,k}(a_{j,k}==1||j==0||k==0)

我们可以把矩阵a的第0行 第0列全部赋为1然后我们拿这个矩阵直接快速幂就可以了!

撕烤了一下发现非常有道理QwQ

3.bzoj2326[HNOI2011]数学作业

Description

小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题:给定正整数 N 和 M

要求计算 Concatenate (1 .. N) Mod M 的值,其中 Concatenate (1 ..N)是将所有正整数 1, 2, …, N 顺序连接起来得到的数。

例如,N = 13, Concatenate (1 .. N)=12345678910111213.小C 想了大半天终于意识到这是一道不可能手算出来的题目,

于是他只好向你求助,希望你能编写一个程序帮他解决这个问题。

Input

只有一行且为用空格隔开的两个正整数N和M,

1≤N≤10^18且1≤M≤10^9.

Output

仅包含一个非负整数,表示 Concatenate (1 .. N) Mod M 的值。

这一题真的是看到了秒了QwQ!然后拿给SCB神犇看,然后他顺手切了...我本来以为我突然灵光乍现...其实是题水啦...QAQ

写一下转移F_i=F_{i-1}*10^{cnt(i)}+icnt(i)表示位数

我们发现当N的位数发生变化的时候算起来是不一样的所以我们可以对F分段求

我们先暴力算出N=10^k的情况。

然后构造一发矩阵

\begin{bmatrix} F_i & i & 1 \end{bmatrix}*\begin{bmatrix} 10^k & 0 & 0 \\ 1 &1 &0\\1&1 &1\end{bmatrix}=\begin{bmatrix} F_i*10^k+i+1 \\ i+1 \\ 1 \end{bmatrix}=\begin{bmatrix} F_{i+1} \\ i+1 \\ 1 \end{bmatrix}

非常优秀对不对!!!然后我们依然可以矩阵快速幂解决!!!

预告:bzoj1009 GT考试

由于笔者这几个题都还没写所以滚粗去写了QAQ

posted @ 2018-09-26 15:55  寒雨微凝  阅读(413)  评论(0编辑  收藏  举报