模板——矩阵快速幂+矩阵乘法

#include<bits/stdc++.h>
using namespace std;
const long long P=1e9+7;
long long n,m;
struct nob{
	long long juzhen[105][105];
	friend nob operator * (const nob &a,const nob &b){
		nob c;
		for (int i=1; i<=n; i++){
			for (int l=1; l<=n; l++){
				long long sum=0;
				for (int k=1; k<=n; k++){
					sum+=a.juzhen[i][k]*b.juzhen[k][l];
					sum%=P;
				}
				c.juzhen[i][l]=sum;
			}
		}
		return c;
	}
}s[100];
nob resite(){
	nob a;
	for (int i=1; i<=n; i++){
		for (int l=1; l<=n; l++){
			if (i==l) a.juzhen[i][l]=1;
			else a.juzhen[i][l]=0;
		}
	}
	return a;
}
nob fastpow(nob x,long long k){
	nob ans=resite();
	while (k){
		if (k&1) ans=x*ans;
		x=x*x;
		k>>=1;
	}
	return ans;
}
int main(){
	cin>>n>>m;
	for (int i=1; i<=n; i++){
		for (int l=1; l<=n; l++){
			cin>>s[1].juzhen[i][l];
		}
	}
	s[2]=fastpow(s[1],m);
	for (int i=1; i<=n; i++){
		for (int l=1; l<=n; l++){
			cout<<s[2].juzhen[i][l]<<" ";
		}
		cout<<endl;
	}
	return 0;
}

感觉是一个极其丑陋而且比较慢的(应该吧,因为看起来比较慢)矩乘。QAQ

时间: 2024-10-16 23:09:23

模板——矩阵快速幂+矩阵乘法的相关文章

[POJ 3150] Cellular Automaton (矩阵快速幂 + 矩阵乘法优化)

Cellular Automaton Time Limit: 12000MS   Memory Limit: 65536K Total Submissions: 3048   Accepted: 1227 Case Time Limit: 2000MS Description A cellular automaton is a collection of cells on a grid of specified shape that evolves through a number of dis

HDU 4965 Fast Matrix Caculation ( 矩阵乘法 + 矩阵快速幂 + 矩阵乘法的结合律 )

HDU 4965 Fast Matrix Calculation ( 矩阵乘法 + 矩阵快速幂 + 矩阵乘法的结合律 ) #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define MAX_SIZE 1001 #define CLR( a, b ) memset( a, b, sizeof(a) ) #define MOD 6 typedef long lo

hdu 4965 矩阵快速幂 矩阵相乘性质

Fast Matrix Calculation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 170    Accepted Submission(s): 99 Problem Description One day, Alice and Bob felt bored again, Bob knows Alice is a gir

poj 3735 Training little cats 矩阵快速幂+稀疏矩阵乘法优化

题目链接 题意:有n个猫,开始的时候每个猫都没有坚果,进行k次操作,g x表示给第x个猫一个坚果,e x表示第x个猫吃掉所有坚果,s x y表示第x个猫和第y个猫交换所有坚果,将k次操作重复进行m轮,问最后这n个猫各自有多少坚果. 题解:构造(n+1)*(n+1)的单位矩阵,data[i][j]表示第i个猫与第j个猫进行交换,最后一列的前n项就是每个猫的坚果数目,s操作就交换对应行,矩阵快速幂时间复杂度O(n^3*log2(m))会超时,我们注意到在n*n的范围内每一行只有一个1,利用稀疏矩阵的

省选算法学习-矩阵与矩阵快速幂

0x00 引入 矩阵,顾名思义,就是由数构成的矩形阵列 比如这样的:$\begin{array}{l}\begin{bmatrix}2&3&4\0&7&13\c&\alpha&\sqrt5\end{bmatrix}\\end{array}$ 就是一个3*3的矩阵 矩阵在信息学乃至数学里面的用处都非常广泛,下面就来介绍下它的一些基本知识,以及常用的地方.本文同时还会介绍矩阵快速幂以及快速矩阵乘法. 0x01 何为矩阵 矩阵的定义 其实就是上面那样的啦.....

关于快速幂、快速乘、矩阵快速幂

一.快速幂 快速幂是用于解决类似$a^b$ $mod$ $p$值类型的问题的.使用普通的方法是从$1$循环至$b$,再逐次累乘,逐次取模.但这种方法对于$b$很大的时候却可能会超时.那么,这时候我们就需要使用快速幂了. 快速幂是基于以下式子: 若$b$ $mod$ $2=1$,则$a^b=a^\frac{b}{2}\times a^\frac{b}{2}\times a$ 若$b$ $mod$ $2=0$,则$a^b=a^\frac{b}{2}\times a^\frac{b}{2}$ 这样,我

【总结】矩阵快速幂

在学习矩阵快速幂之前,首先我们需要分别了解快速幂和矩阵乘法 快速幂 快速幂要求解的是这样一类问题: 给你A,B,C,求A的B次方模C的余数 A,C<=10^9,B<=10^18 如果我们线性去求,时间复杂度是O(n)的,但题目中给出的B是很大的数,这样显然会超时,我们可以用快速幂来加速这个过程. 我们可以想像一下小学的时候我们如何计算2^16 2^16=4^8=16^4=256^2=65536 那如何计算2^18呢? 2^18=4^9=44^8=416^4=4256^2=465536=2621

算法学习 - 快速幂和矩阵快速幂(复杂度Olog(n))C++实现

快速幂 快速幂顾名思义,就是快速算某个数的多少次幂.其时间复杂度为 O(log?N), 与朴素的O(N)相比效率有了极大的提高. 快速幂实现原理 快速幂的原理比较好懂,就是说假如我们求的是3^11,其实比较通用的办法就是 for 1:11 a*=3; 时间复杂度为O(n), 那么我们有没有更快的办法呢? 有的~就是下面要说的快速幂. 快速幂就是把指数进行一次log(N)级别的变换.11 = 2^3+2^1+2^0 那么我只需要算3^1和3^2还有3^8这样复杂度就降下来了.算3^1需要一次记为a

矩阵乘法 洛谷 P3390【模板】矩阵快速幂

P3390 [模板]矩阵快速幂 题目背景 矩阵快速幂 题目描述 给定n*n的矩阵A,求A^k 输入输出格式 输入格式: 第一行,n,k 第2至n+1行,每行n个数,第i+1行第j个数表示矩阵第i行第j列的元素 输出格式: 输出A^k 共n行,每行n个数,第i行第j个数表示矩阵第i行第j列的元素,每个元素模10^9+7 输入输出样例 输入样例#1: 2 1 1 1 1 1 输出样例#1: 1 1 1 1 说明 n<=100, k<=10^12, |矩阵元素|<=1000 算法:矩阵快速幂