luogu3390 矩阵快速幂

题目

luogu3390

代码

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 205;
const ll mod = 1e9 + 7;

ll n, k;

struct node
{
	ll mp[N][N];
	void clear() {memset(mp, 0, sizeof(mp));}
}x, ans;

node operator * (node a, node b)
{
	node t; t.clear();
	for(int i = 1; i <= n; i++)
		for(int j = 1; j <= n; j++)
			for(int k = 1; k <= n; k++) t.mp[i][j] = (t.mp[i][j] + a.mp[i][k] * b.mp[k][j]) % mod;
	return t;
}

void ksm()
{
	for(int i = 1; i <= n; i++) ans.mp[i][i] = 1;
	while(k)
	{
		if(k & 1) ans = ans * x;
		x = x * x; k >>= 1;
	}
}

int main()
{
	cin >> n >> k;
	x.clear(); ans.clear();
	for(int i = 1; i <= n; i++)
		for(int j = 1; j <= n; j++) cin >> x.mp[i][j];
	ksm();
	for(int i = 1; i <= n; i++)
	{
		for(int j = 1; j <= n; j++) cout << ans.mp[i][j] << " ";
		cout << endl;
	}
	return 0;
}
原文地址:https://www.cnblogs.com/XYZinc/p/7802195.html