矩阵乘法及矩阵链乘的快速幂优化

一、矩阵乘法

 1 struct datatype
 2 {
 3     int a[2][2];
 4 };
 5 datatype multiple(datatype x,datatype y)
 6 {
 7     datatype res;
 8     memset(res.a,0,sizeof(res.a));
 9     for(int i=0;i<=1;i++)
10     {
11         for(int j=0;j<=1;j++)
12         {
13             for(int k=0;k<=1;k++)
14             {
15                 res.a[i][j]+=x.a[i][k]*y.a[k][j];
16             }
17         }
18     }
19     for(int i=0;i<=1;i++)
20     {
21         for(int j=0;j<=1;j++)
22         {
23             res.a[i][j]%=10000;
24         }
25     }
26     return res;
27 }

二、矩阵链乘的快速幂优化

 1 struct datatype
 2 {
 3     int a[2][2];
 4 };
 5 datatype multiple(datatype x,datatype y)
 6 {
 7     datatype res;
 8     memset(res.a,0,sizeof(res.a));
 9     for(int i=0;i<=1;i++)
10     {
11         for(int j=0;j<=1;j++)
12         {
13             for(int k=0;k<=1;k++)
14             {
15                 res.a[i][j]+=x.a[i][k]*y.a[k][j];
16             }
17         }
18     }
19     for(int i=0;i<=1;i++)
20     {
21         for(int j=0;j<=1;j++)
22         {
23             res.a[i][j]%=10000;
24         }
25     }
26     return res;
27 }
28 datatype power(datatype x,int y)
29 {
30     datatype res,t;
31     res.a[0][0]=1;
32     res.a[0][1]=0;
33     res.a[1][0]=0;
34     res.a[1][1]=1;
35     t=x;
36     while(y)
37     {
38         if(y&1)
39         {
40             res=multiple(res,t);
41         }
42         t=multiple(t,t);
43         y>>=1;
44     }
45     return res;
46 }
时间: 2024-08-04 19:28:11

矩阵乘法及矩阵链乘的快速幂优化的相关文章

矩阵乘法以及矩阵快速幂模板

两矩阵 A * B ,当 A 的行数等于 B 的列数时,A * B 合法,结果如下: 1 #include<stdio.h> 2 #include<string.h> 3 4 struct mat{ 5 int r,c; //r即row,矩阵行数:c即column,矩阵列数 6 int m[10][10]; //矩阵 7 }; 8 9 mat MatMul(mat m1,mat m2){ //仅当m1.r==m2.c时可以相乘,相乘时可加模运算 10 mat tmp; 11 tmp

矩阵快速幂优化递推总结

RT,主要总结一下矩阵的求法. 首先能用矩阵快速幂优化的递推类型是f[n]=5f[n-3]+6f[n-2]+2f[n-1]+n^2+n+8之类的 也就是说递推是线性递推且f[n-i]前面的系数是常数,可以含有与n有关的多项式,也可以含有常数的这种递推,下面总结一下矩阵的写法: 先考虑最简单的常数,我们其实可以忽略常数,因为顶多在没有常数的矩阵外面加一行一列就行了 以f[n]=2f[n-1]+6f[n-2]+5f[n-3]+n^2+n为例 先写迭代的矩阵,一般可以写成一行,右边有几项写几项 {f[

Uva 1386 - Cellular Automaton ( 矩阵乘法 + 循环矩阵 )

Uva 1386 - Cellular Automaton ( 矩阵乘法 + 循环矩阵 ) #include <cstdio> #include <cstring> #define CLR( a, b ) memset( a, b, sizeof(a) ) int MOD; #define MAX_SIZE 500 struct Mat { int n; LL mat[MAX_SIZE][MAX_SIZE]; Mat( int _n = 0 ) { n = _n; CLR( mat

poj 3744 概率dp 矩阵快速幂优化

一位童子兵要穿过一条路,路上有些地方放着地雷.这位童子兵非常好玩,走路一蹦一跳的.每次他在 i 位置有 p 的概率走一步到 i+1 ,或者 (1-p) 的概率跳一步到 i+2.童子兵初始在1位置,求他安全通过这条道路的概率. 以所在位置为状态,dp[i] 表示在位置 i 的安全的概率. dp[i] = p * dp[i-1] + (1 - p) * dp[i-2]; // i 位置没有地雷 但是题目数据的范围是 10^8 这样dp的话会 TLE. 想想可以用矩阵快速幂优化.简单退出矩阵是 |p

[NOI2011] 兔农 矩阵乘法,矩阵的等比数列求和

#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; typedef long long ll; ll n,p; ll k; #define N 4000000 ll a[N],fr[N]; struct sq{ ll a[3][3]; sq(){memset(a,0,sizeof(a));} sq operator*(sq

HDU 5863 cjj&#39;s string game ( 16年多校10 G 题、矩阵快速幂优化线性递推DP )

题目链接 题意 : 有种不同的字符,每种字符有无限个,要求用这k种字符构造两个长度为n的字符串a和b,使得a串和b串的最长公共部分长度恰为m,问方案数 分析 : 直觉是DP 不过当时看到 n 很大.但是 m 很小的时候 发现此题DP并不合适.于是想可能是某种组合数学的问题可以直接公式算 看到题解的我.恍然大悟.对于这种数据.可以考虑一下矩阵快速幂优化的DP 首先要想到线性递推的 DP 式子 最直观的想法就是 dp[i][j] = 到第 i 个位置为止.前面最长匹配长度为 j 的方案数 但是如果仔

蓝桥杯 BASIC_17 矩阵乘法 (矩阵快速幂)

问题描述 给定一个N阶矩阵A,输出A的M次幂(M是非负整数) 例如: A = 1 2 3 4 A的2次幂 7 10 15 22 输入格式 第一行是一个正整数N.M(1<=N<=30, 0<=M<=5),表示矩阵A的阶数和要求的幂数 接下来N行,每行N个绝对值不超过10的非负整数,描述矩阵A的值 输出格式 输出共N行,每行N个整数,表示A的M次幂所对应的矩阵.相邻的数之间用一个空格隔开 样例输入 2 2 1 2 3 4 样例输出 7 10 15 22 这道题题目很简单,而且数据量也很

疯子的算法总结(五) 矩阵乘法 (矩阵快速幂)

学过线性代数的都知道矩阵的乘法,矩阵乘法条件第为一个矩阵的行数等与第二个矩阵的列数,乘法为第一个矩阵的第一行乘以第二个矩阵的第一列的对应元素的和作为结果矩阵的第一行第一列的元素.(详解参见线性代数) 于是我们可以写出矩阵惩乘法的代码 struct JZ{ int m[maxn][maxn]; }; JZ muti(JZ a,JZ b) { JZ temp; memset(temp.m,0,sizeof(temp.m)); for(int i=0;i<maxn;i++) for(int j=0;j

蓝桥基础练习 矩阵乘法 BASIC-17(矩阵快速幂)

问题描述 给定一个N阶矩阵A,输出A的M次幂(M是非负整数) 例如: A = 1 2 3 4 A的2次幂 7 10 15 22 输入格式 第一行是一个正整数N.M(1<=N<=30, 0<=M<=5),表示矩阵A的阶数和要求的幂数 接下来N行,每行N个绝对值不超过10的非负整数,描述矩阵A的值 输出格式 输出共N行,每行N个整数,表示A的M次幂所对应的矩阵.相邻的数之间用一个空格隔开 样例输入 2 21 23 4 样例输出 7 1015 22 解:矩阵乘法满足结合律,所以也可以用快