矩阵快速幂

在讲矩阵快速幂之前,要说清楚矩阵乘法是什么。

矩阵乘法,用来干什么,我这个小蒟蒻并不知道。

但是,有大佬对于他的作用可能有着自己的理解

【看大佬blog】

我这里找的题目是洛谷3390 矩阵快速幂的模板

方法和整数的快速幂是一样的

自己重载一下乘号即可

顺带推荐一个大佬对于矩阵快速幂的理解(%%%songyuchen大佬)
%%%大佬

已经有大佬对于矩阵乘法的方法的讲解了,我就不再多说
直接贴一下矩阵快速幂的代码

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define MAX 101
#define MOD (1000000007)
long long n,k;
struct yl//矩阵 
{
	   int n;//大小
	   long long g[MAX][MAX];  
};
yl operator*(yl a,yl b)//定义乘法 
{
	   int n=a.n;
	   yl cool;
	   memset(cool.g,0,sizeof(cool.g));
	   for(int i=1;i<=n;++i)
	   	    for(int j=1;j<=n;++j)
				 for(int k=1;k<=n;++k)
				        cool.g[i][j]=(cool.g[i][j]+1ll*a.g[i][k]*b.g[k][j]%MOD)%MOD;
	   cool.n=n;
	   return cool;
}
void write(yl a)
{
	   int n=a.n;
	   for(int i=1;i<=n;++i)
	   {
	       for(int j=1;j<=n;++j)
		      cout<<a.g[i][j]<<' ';
		   cout<<endl;
	   }
}
yl Pow(yl a,long long b)//a的b次方
{
	   if(b==1)return a;
	   yl s=Pow(a,b/2);
	   s.n=a.n;
	   s=s*s;
	   if(b&1)s=s*a;
	   return s;
}

int main()
{   
       cin>>n>>k;
       yl Six;
       Six.n=n;
       for(int i=1;i<=n;++i)
          for(int j=1;j<=n;++j)
             cin>>Six.g[i][j];
       write(Pow(Six,k));
	   return 0;
}
posted @ 2017-07-17 16:55  小蒟蒻yyb  阅读(440)  评论(2编辑  收藏  举报