矩阵
矩阵的基本概念
矩阵的定义
由 个数 排成的 行 列的数表称为 行 列的矩阵,简称 矩阵。记作:
这 个数称为矩阵 的元素,简称为元,数 位于矩阵 的第 行第 列。上面的矩阵还可以简记为:。
几种特殊的矩阵
-
行数和列数都等于 的矩阵 , 称为 阶方阵(也叫 阶矩阵)。
-
只有一行的矩阵称为行矩阵(或行向量)。
-
只有一列的矩阵称为列矩阵(或列向量)。
-
矩阵 和 的行数列数分别相同,称为同型矩阵。
-
元素全为 的矩阵称为零矩阵,记做 。注意:不同阶数的零矩阵是不相同的。
-
主对角线(左上到右下)的元素都为 ,其他元素都为 的 阶方阵称为单位矩阵。
同时单位矩阵也可以简单地记为一个对角线矩阵:。
对于不同矩阵他们的单位矩阵大小是不同的,对于 的矩阵,它的单位矩阵大小为 ,对于 的矩阵,它的单位矩阵大小为 。也就是说单位矩阵都是正方形的,这是因为只有正方形的矩阵能保证结果和前一个矩阵形状相同
-
对角矩阵(diagonal matrix)是一个主对角线主)之外的元素皆为 的方阵。
其中 不全为 ,也可记作:
-
如果两个同型矩阵的对应元素相等,则两个矩阵相等。
线性变换矩阵
线性变换矩阵 一种特殊矩阵。指该矩阵可以通过线性变换得到。
个变量 与 个变量 之间的关系式:
表示从变量 到变量 的线性变换,其中 为常数。
我们把系数取出,写成矩阵的形式,其系数矩阵为:
可以看出线性变换与矩阵之间存在一一对应的关系。
矩阵运算
1. 矩阵加减法
设有两个 的矩阵 和矩阵 ,那么 和 的和记为 ,规定:
注意:两个同型矩阵才可以做加法。
矩阵的加减法满足的运算定律:
交换律
结合律 。
2.矩阵乘法
设 是一个 矩阵, 是一个 矩阵,那么 和 的乘积 是一个 矩阵,其中:
矩阵乘法满足的运算定律:
结合律:
左分配律:(A+B)C=AC+BC
右分配律:C(A+B)=CA+CB
数乘: k(AB)=(kA)B=A(kB)
转置:
设 为 阶矩阵(即 行 列),第 行 列的元素是 ,即:把 矩阵 的行换成同序数的列得到一个 矩阵,此矩阵叫做 的转置矩阵,记做 。例如:
转置的基本性质、
注意:矩阵乘法一般不满足交换律
矩阵乘法代码
#include<bits/stdc++.h>
const int maxn = 100 + 5;
using namespace std;
int a[maxn][maxn], b[maxn][maxn], c[maxn][maxn];
int main(){
int m,n,k;
scanf("%d%d%d", &m, &n, &k);
for(int i = 1; i <= m; ++i)
for(int j = 1; j <= n; ++j)
scanf("%d", &a[i][j]);
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= k; ++j)
scanf("%d", &b[i][j]);
for(int i = 1; i <= m; ++i)//枚举a的行数m
for(int j = 1; j <= k; ++j)//枚举b的列数k
for(int kk = 1; kk <= n; ++kk)//枚举a的列(b的行)
c[i][j] += a[i][kk]*b[kk][j];
return 0;
}
Fibonacci 数列
时间限制:1 s 内存限制:128 MB 文件:
题目描述
斐波拉切数列, ,满足: ,请求出 的值,由于答案可能会很大,只需输出答案模 的结果。
输入格式
输入包含多组数据,第一行为一个正整数 ,表示有T组输入。
每组输入为一个正整数 ,表示求斐波拉切数列第 的值模 的结果。
输出格式
对每组输入输出一个答案。
样例输入
4
0
9
999999999
1000000000
样例输出
0
34
626
6875
样例解释
数据范围与提示
对 的数据满足: 。
分析
的递推很容想到,但 高达 显然在线性时间效率上显然会超时,构造矩阵,列矩阵 ,则有:
因为 的第一行第二列答案和 的第一行第一列答案一样, 所以只需求出 即可,答案为矩阵第一行第二列。现在关键是如何快速求出 ,其实矩阵快速幂跟普通快速幂思想是一样的,不同的地方答案初始化为对角线为 ,其他为 的单位矩阵,普通乘法改为矩阵乘法即可,具体操作见代码实现。
代码实现:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2, Mod = 10000;
void Matrix(int a[][2], int b[][2]){//矩阵乘法
int c[maxn][maxn] = {0};
for(int i = 0; i < 2; ++i)
for(int j = 0; j < 2; ++j)
for(int k = 0; k < 2; ++k)
c[i][j] =(c[i][j] + a[i][k] * b[k][j]) % Mod;
for(int i = 0; i < 2; ++i)
for(int j = 0; j < 2; ++j)
a[i][j] = c[i][j];
}
//A为转移矩阵,res初始为基础矩阵存储答案
int Pow(int A[][2], int n, int res[][2]){//矩阵快速幂
for(; n; n >>= 1){
if(n & 1) Matrix(res, A);
Matrix(A, A);
}
return res[0][1];
}
int main(){
int N;scanf("%d", &N);
while(N--){
int n; scanf("%d", &n);
//A为转移矩阵,res存储 A^n%10000的结果,初始为基础矩阵
int A[maxn][maxn] = {1, 1, 1, 0}, res[maxn][maxn]={1, 0, 0, 1};
printf("%d\n", Pow(A, n, res));
}
}
矩阵加速
题目描述
已知一个数列 ,它满足:
求 数列的第 项对 取余的值。
输入格式
第一行一个整数 ,表示询问个数。
以下 行,每行一个正整数 。
输出格式
每行输出一个非负整数表示答案。
样例 1 输入
3
6
8
10
样例 1 输出
4
9
19
数据范围
- 对于 的数据 ;
- 对于 的数据 ;
- 对于 的数据 ,。
分析
跟上一题类似,首先我们要构造出初始矩阵、目标矩阵和转移矩阵,首先初始矩阵矩阵显然为 ,根据初始矩阵我们构造出目标矩阵 ,那如何构造出转移矩阵呢?显然目标矩阵需要从上一个矩阵 推导而来,即: 根据递推式,当 时,显然有:
很容易推出:
代码实现
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int Mod = 1e9 + 7;
void Matrix(ll a[][3], ll b[][3]){
ll c[3][3] = {0};
for(int i = 0; i < 3; i++)
for(int j = 0; j < 3; j++)
for(int k = 0; k < 3; k++)
c[i][j] = (c[i][j] + a[i][k] * b[k][j]) % Mod;
for(int i = 0; i < 3; ++i)
for(int j = 0; j < 3; ++j)
a[i][j] = c[i][j];
}
void Pow(ll a[][3], int n, ll res[][3]){
for(; n; n >>= 1){
if(n & 1) Matrix(res, a);
Matrix(a, a);
}
}
void Sol(){
int T; scanf("%d", &T);
while(T--){
int n; scanf("%d", &n);
if(n <= 3){
printf("1\n"); continue;
}
ll res[3][3] = {1, 0, 0, 0, 1, 0, 0, 0, 1},
A[3][3] = {1, 0, 1, 1, 0, 0, 0, 1, 0};
Pow(A, n - 3, res);
ll ans = (res[0][0] + res[0][1] + res[0][2]) % Mod;
printf("%lld\n", ans);
}
}
int main(){
Sol();
return 0;
}
斐波那契前 n 项和
题目描述
大家都知道 Fibonacci 数列吧,。
现在问题很简单,输入 和 ,求 的前 项和 。
输入格式
共一行,包含两个整数 和 。
输出格式
输出前 项和 的值。
样例 1 输入
5 1000
样例 1 输出
12
数据范围
对 数据满足: 。
方一:分析
我们先来推推公式:
结论:对于数列 ,若 ,那么存在如下结果:
证明:
当 时
显然成立,假设 结论也成立,两边同时乘以相同矩阵可得:
所以 时也成立。得证。
由上述结论我们很容易构造出转移矩阵 ,初始矩阵为 。
方二:分析
显然有:
证明:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效