P3390 【模板】矩阵快速幂

题目

分析

矩阵快速幂模板题。

注意的几个点:

优化常数。

还有记得矩阵的初始化需要memset(不知道为什么会wa)

代码

#include<bits/stdc++.h>
using namespace std;
//#define getchar()(p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
//char buf[1<<21],*p1=buf,*p2=buf;
template <typename T>
inline void read(T &x){
	x=0;char ch=getchar();bool f=false;
	while(!isdigit(ch)){if(ch=='-'){f=true;}ch=getchar();}
	while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
	x=f?-x:x;
	return ;
}
template <typename T>
inline void write(T x){
	if(x<0) putchar('-'),x=-x;
	if(x>9) write(x/10);
	putchar(x%10^48);
	return ;
}
#define ll long long
const int N=105;
const ll INF=1e12,MOD=1e9+7;
const double eps=1e-6;
#define PII pair<int,int>
#define fi first
#define se second
#define pb push_back
int n;
ll m;
inline ll inc(ll x,ll y){return x+y>=MOD?x+y-MOD:x+y;}
struct Matrix{
	ll a[N][N];
	Matrix(){memset(a,0,sizeof(a));}
	inline Matrix operator * (const Matrix &B)const{
		Matrix C;
		for(int i=1;i<=n;i++){
			for(int k=1;k<=n;k++){
				ll r=a[i][k];
				for(int j=1;j<=n;j++) C.a[i][j]=(C.a[i][j]+r*B.a[k][j])%MOD;
			}
		}
		return C;
	}
	inline Matrix operator + (const Matrix &B)const{
		Matrix C;
		for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) C.a[i][j]=a[i][j]+B.a[i][j];
		return C;
	}
	inline void print(){
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++) write(a[i][j]),putchar(' ');
			putchar('
');
		}
		return ;
	}
};
inline Matrix QuickPow(Matrix x,ll y){
	Matrix res;
	for(int i=1;i<=n;i++) res.a[i][i]=1;
	while(y){
		if(y&1) res=res*x;
		x=x*x;
		y>>=1;
	}
	return res;
}
signed main(){
	read(n);read(m);
	Matrix r;
	for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) read(r.a[i][j]);
	Matrix res;
	for(int i=1;i<=n;i++) res.a[i][i]=1;
	while(m){
		if(m&1) res=res*r;
		r=r*r;
		m>>=1;
	}
	res.print();
	return 0;
}
原文地址:https://www.cnblogs.com/Akmaey/p/15037020.html