循环矩阵乘

仅供个人查看,没有验证其正确性。

循环矩阵快速幂是可以通过一个一维数组来完成的。(我之前一直用二维数组,比较好理解)

比如说一个$5 \times 5$的循环矩阵,再乘一个$5 \times 5$的矩阵,

        $\times$                      $=$           

第一个用数组$a$表示,第二个用数组$b$表示,第三个用数组$c$表示,

那么我们把$a$和$b$相乘得到的$c$仍然是循环矩阵。

把所有情况都列出来:

根据矩阵乘定义:$c[1]=a[1][1]*b[1][1]+a[1][2]*b[2][1]+a[1][3]*b[3][1]+a[1][4]*b[4][1]+a[1][5]*b[5][1]$,

根据上面的图,把它们都编号($"\times"$前边的是$a$,后边的是$b$),那么:

$c[1]=1\times 1+2\times 5+3\times 4+4\times 3+5\times 2$,

$c[2]=1\times 2+2\times 1+3\times 5+4\times 4+5\times 3$

$c[3]=1\times 3+2\times 2+3\times 1+4\times 5+5\times 4$

$c[4]=1\times 4+2\times 3+3\times 2+4\times 1+5\times 5$

$c[5]=1\times 5+2\times 4+3\times 3+4\times 2+5\times 1$

这样就发现规律了吧,这东西也是循环的,$c[i]=\sum \limits_{j=1}^n a[j]\times b[(i-j+n)\% n+1]$。

这样就能开一维数组存了。

丑陋的伪代码:

for(Reg int i=1;i<=n;++i)
    for(Reg int j=1;j<=n;++j)
        c[i]+=a[j]*b[(i-j+n)%n+1];

原文地址:https://www.cnblogs.com/Milk-Feng/p/11219062.html

时间: 2024-10-17 11:03:53

循环矩阵乘的相关文章

UVA 1386 - Cellular Automaton(循环矩阵)

UVA 1386 - Cellular Automaton 题目链接 题意:给定一个n格的环,现在有个距离d,每次变化把环和他周围距离d以内的格子相加,结果mod m,问经过k次变换之后,环上的各个数字 思路:矩阵很好想,每个位置对应周围几个位置为1,其余位置为0,但是这个矩阵有500,有点大,直接n^3去求矩阵不太合适,然后观察发现这个矩阵是个循环矩阵,循环矩阵相乘的话,只需要保存一行即可,然后用n^2的时间就足够计算了 代码: #include <stdio.h> #include <

弱题(循环矩阵1)

问题 D: 弱题 时间限制: 1 Sec  内存限制: 128 MB提交: 46  解决: 28[提交][状态][讨论版] 题目描述 有M个球,一开始每个球均有一个初始标号,标号范围为1-N且为整数,标号为i的球有ai个,并保证Σai = M. 每次操作等概率取出一个球(即取出每个球的概率均为1/M),若这个球标号为k(k < N),则将它重新标号为k + 1:若这个球标号为N,则将其重标号为1.(取出球后并不将其丢弃) 现在你需要求出,经过K次这样的操作后,每个标号的球的期望个数. 输入 第1

POJ3150—Cellular Automaton(循环矩阵)

题目链接:http://poj.org/problem?id=3150 题目意思:有n个数围成一个环,现在有一种变换,将所有距离第i(1<=i<=n)个数小于等于d的数加起来,对m取余,现在要求将所有的数都变换k次,得到的n个数的值. 思路:构造一个循环矩阵,以下这个矩阵是以样例1为例的循环矩阵. 1 1 0 0 1 1 1 1 0 0 0 1 1 1 0 0 0 1 1 1 1 0 0 1 1 我们发现n尽然达到了500,复杂度是n^3logk,过不了,我们发现这个矩阵长得很奇葩,每一行都是

FZU Problem 1692 Key problem(循环矩阵)

循环矩阵,这里有解说:http://wenku.baidu.com/link? url=zcJ-sxrj0QDqzz8xCnHTnB7gxjoNRyOZzS4_4ZA22c8Bs9inYn6vVkqTVr_w-riLa8oRnYA9SRcCZ9f4UciCUNGeNAG4dCGclYRPS18YLGa 推出第一层以下依据性质就能够得到. Problem 1692 Key problem Accept: 144    Submit: 663 Time Limit: 1000 mSec    Mem

循环矩阵

1 #include <stdio.h> 2 #include <string.h> 3 #define ll long long 4 const int maxn = 505; 5 ll n,m,d,k,a[maxn]; 6 struct mat{ // 结构体循环矩阵,原矩阵式方阵 7 ll v[maxn]; 8 mat() {memset(v,0,sizeof(v));} // 构造函数 9 mat operator*(mat c){ // 重载乘法运算符 10 mat an

hihocoder 1388 fft循环矩阵

#1388 : Periodic Signal 时间限制:5000ms 单点时限:5000ms 内存限制:256MB 描述 Profess X is an expert in signal processing. He has a device which can send a particular 1 second signal repeatedly. The signal is A0 ... An-1 under n Hz sampling. One day, the device fell

bzoj 2510: 弱题 循环矩阵

2510: 弱题 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 124  Solved: 61[Submit][Status][Discuss] Description 有M个球,一开始每个球均有一个初始标号,标号范围为1-N且为整数,标号为i的球有ai个,并保证Σai = M. 每次操作等概率取出一个球(即取出每个球的概率均为1/M),若这个球标号为k(k < N),则将它重新标号为k + 1:若这个球标号为N,则将其重标号为1.(取出球后并不

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

BZOJ 4204 取球游戏 循环矩阵优化期望递推

题意:链接 方法:循环矩阵优化期望递推. 解析: 这题递推没啥,主要是循环矩阵优化 我们发现,如果直接上矩阵优化的话是n^3log,所以铁定是过不了了的,然后再观察一下这道题我们要求幂的矩阵,发现他是这种形式 1 1 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 1 1 1 0 0 0 1 每一行都是上一行向右窜了一位 所以我们可以用一个一维数组代表这个循环矩阵 并且循环矩阵求和,乘积还是循环矩阵 所以我们就可以用循环矩阵来优化掉一个n 复杂度即变为了n^2log 可过. 代码

LA 3704 (矩阵快速幂 循环矩阵) Cellular Automaton

将这n个格子看做一个向量,每次操作都是一次线性组合,即vn+1 = Avn,所求答案为Akv0 A是一个n*n的矩阵,比如当n=5,d=1的时候: 不难发现,A是个循环矩阵,也就是将某一行所有元素统一向右移动一位便得到下一行. 而且循环矩阵相乘仍然是循环矩阵,所以只要求出Ak的第一行就行了. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 6