洛谷 P3390 【模板】矩陣快速冪


思路

這是一道模板題!!

矩陣快速冪是一個重要的東西,我們可以用普通的快速冪來做,重載一下運算符(dalao題解),然后就可以做了

推薦這篇題解

傳送門

代碼

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define int long long
#define N 110
#define MOD 1000000007
using namespace std;

inline int read() {
	char c=getchar();
	int x=0,f=1;
	while(c<'0'||c>'9') {
		if(c=='-')f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9')x=x*10+c-48,c=getchar();
	return x*f;
}

int n,k;

struct node {
	int a[N][N];
	node() {
		memset(a,0,sizeof(a));
	}
	inline void build() {
		for(int i=1; i<=n; i++)a[i][i]=1;
	}
} a;

node operator *(const node &x, const node &y) {
	node z;
	for(int k=1; k<=n; k++) {
		for(int i=1; i<=n; i++) {
			for(int j=1; j<=n; j++) {
				z.a[i][j]=(z.a[i][j]+x.a[i][k]*y.a[k][j]%MOD)%MOD;
			}
		}
	}
	return z;
}
node ans;

void power() {
	while(k) {
		if(k&1)ans=ans*a;
		a=a*a;
		k>>=1;
	}
}

signed main() {
	n=read();
	k=read();
	for(int i=1; i<=n; i++) {
		for(int j=1; j<=n; j++) {
			a.a[i][j]=read();
		}
	}
	ans.build();
	power();
	for(int i=1; i<=n; i++) {
		for(int j=1; j<=n; j++) {
			cout<<ans.a[i][j]<<" ";
		}
		cout<<'\n';
	}
	return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM