1. 程式人生 > >模板——矩陣快速冪+矩陣乘法

模板——矩陣快速冪+矩陣乘法

一個 ace 快速 應該 namespace cin ast c++ truct

#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

模板——矩陣快速冪+矩陣乘法