10pts求调
查看原帖
10pts求调
1288333
XURUIFAN楼主2024/11/24 22:49

rt,AC on #10

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 110;
#define mod 1000000007
struct Matrix {
	int n, m;
	ll mat[N][N];
	Matrix(int a = 0, int b = 0, ll value = 0) {
		n = a;
		m = b;
		for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) mat[i][j] = value;
	}
	Matrix operator = (Matrix b) {
		Matrix a(b.n, b.m);
		for (int i = 0; i < a.n; i++)
			for (int j = 0; j < a.m; j++)
				a.mat[i][j] = b.mat[i][j];
		return a;
	}
};
Matrix demax(int n) {
	Matrix ans(n, n, 0);
	for (int i = 0; i < n; i++) ans.mat[i][i] = 1;
	return ans;
}
istream& operator >> (istream& in, Matrix& a) {
	for (int i = 0; i < a.n; i++)
		for (int j = 0; j < a.m; j++)
			in >> a.mat[i][j];
	return in;
}
ostream& operator<< (ostream& out, Matrix a) {
	for (int i = 0; i < a.n; i++) {
		for (int j = 0; j < a.m; j++)
			out << a.mat[i][j] << " ";
		out << "\n";
	}
	return out;
}
void swap(Matrix& a, Matrix& b) {
	Matrix t;
	t = a;
	a = b;
	b = t;
}
Matrix operator + (Matrix a, Matrix& b) {
	Matrix ans(a.n, a.m);
	for (int i = 0; i < ans.n; i++)
		for (int j = 0; j < ans.m; j++)
			ans.mat[i][j] = (a.mat[i][j] + b.mat[i][j]) % mod;
	return ans;
}
Matrix operator * (Matrix a, Matrix b) {
	if (a.n != b.m && a.m != b.n) raise(1);
	if (a.m != b.n) swap(a, b);
	Matrix ans(a.n, b.m);
	for (int i = 0; i < ans.n; i++)
		for (int j = 0; j < ans.m; j++)
			for (int k = 0; k < a.m; k++) {
				ans.mat[i][j] += (a.mat[i][k] * b.mat[k][j]) % mod;
				ans.mat[i][j] %= mod;
			}
	return ans;
}
Matrix operator %(Matrix a, int p) {
	for (int i = 0; i < a.n; i++)
		for (int j = 0; j < a.m; j++)
			a.mat[i][j] %= p;
	return a;
}
Matrix quickly_pow(Matrix a, ll p) {
	if (p == 0) return demax(a.n);
	Matrix ans = quickly_pow(a, p / 2);
//	cout << a << ans << p << "\n";
	ans = ans * ans;
//	cout << a << ans << p << "\n";
	if (p % 2 == 1) {
		ans = ans * a;
//		cout << a << ans << p << "\n";
	}
	return ans;
}
int n;
ll k;
int main() {
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	cin >> n >> k;
	Matrix a(n, n);
	cin >> a;
	cout << quickly_pow(a, k);
	return 0;
}
2024/11/24 22:49
加载中...