矩阵乘法及应用

下面以斐波那契数列来引用矩阵乘法。

已知斐波那契数列:f[1]=1 , f[2]=1 , f[3]=f[1]+f[2].....f[n]=f[n-1]+f[n-2]

能否构造一个矩阵A,使得A*[f(n),f(n + 1)] = [f(n + 1),f(n + 2)]

根据斐波那契的性质,0*f(n)+1*f(n+1)=f(n+1)

                                    1*f(n)+1*f(n+1)=f(n+2)

得矩阵A为\begin{bmatrix} 0 &1 \\ 1 & 1 \end{bmatrix}

例题拓展:斐波那契前 n 项和1303. 斐波那契前 n 项和 - AcWing题库

大家都知道 Fibonacci 数列吧,

f1=1,f2=1,f3=2,f4=3,......,fn=fn-1+fn-2

现在问题很简单,输入 n 和 m,求 fn 的前 n 项和 Sn mod m。

输入格式

共一行,包含两个整数 n 和 m。

输出格式

输出前 n 项和 Sn mod m 的值。

数据范围

1≤n≤2000000000,
1≤m≤1000000010

输入样例:

5 1000

输出样例:

12

题意分析:拓展为三维矩阵,找到一个矩阵A,使得A*[f(n),f(n+1),S(n)]=[f(n+1),f(n+2),S(n+1)]

分析得:S(n+1)=S(n)+f(n+1)

f(n+2)=f(n+1)+f(n) 

故矩阵A为\begin{bmatrix} 0 & 1 &0 \\ 1& 1 &1\\ 0 & 0 & 1 \end{bmatrix}

#include
#include
#include
#include

using namespace std;

typedef long long ll;
const int N=3;

int n,m;

void mul(int c[],int a[],int b[][N])
{
	int temp[N]={0};
	for(int i=0;i>=1;
	}
	cout<

这样看矩阵乘法是很好理解的,但是万万没想到,它的应用出现得猝不及防,真的很难想到原来矩阵乘法还可以这样用

垒骰子1217. 垒骰子 - AcWing题库

赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体。

经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥!

我们先来规范一下骰子:1 的对面是 4,2 的对面是 5,3 的对面是 6。

假设有 m 组互斥现象,每组中的那两个数字的面紧贴在一起,骰子就不能稳定的垒起来。

atm想计算一下有多少种不同的可能的垒骰子方式。

两种垒骰子方式相同,当且仅当这两种方式中对应高度的骰子的对应数字的朝向都相同。

由于方案数可能过多,请输出模 1e9+7 的结果。

输入格式

第一行包含两个整数 n,m,分别表示骰子的数目和排斥的组数。

接下来 m 行,每行两个整数 a,b,表示 a 和 b 数字不能紧贴在一起。

输出格式

共一个数,表示答案模 1e9+7 的结果。

数据范围

1 ≤ n ≤ 10^9,
1 ≤ m ≤ 36,
1 ≤ a , b ≤6

输入样例:

2 1
1 2

输出样例:

544

 分析:这道题得正解是dp + 矩阵乘法,对于两个互斥得骰子来说有0种摆放方案,否则有四种(不同方向)的摆放方案。

状态表示:f [ i ][ j ] 表示前 i 个骰子且第 i 个骰子数字 j 朝上 

状态转移:状态转移f[i][j] = f[i - 1][k] * 4

(侧面可旋转四次) (k从1到6)

关键一步:需要从\begin{Bmatrix} f[n][1], &f[n][2] ,&f[n][3], &f[n][4], &f[n][5], &f[n][6] \end{Bmatrix}

转为\begin{Bmatrix} f[n+1][1], &f[n+1][2], &f[n+1][3], &f[n+1][4] , &f[n+1][5], &f[n+1][6] \end{Bmatrix}

矩阵构造需要根据题目给出的互斥组来决定

具体题解移步AcWing 1217. 垒骰子 - AcWing,不得不说大佬太强了

你可能感兴趣的:(矩阵,算法,矩阵乘法)