10pts只有最后一点对玄关求条
查看原帖
10pts只有最后一点对玄关求条
314601
gjiajia楼主2024/8/14 17:33
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 101, MOD = 1e9 + 7;
inline int read()
{
	int sign = 1;
	char c;
	while((c = getchar()) > '9' || c < '0')
	{
		if(c == '-')
			sign = -1;
	}
	int res = c - '0';
	while((c = getchar()) >= '0' && c <= '9')
		res = 10 * res + c - '0';
	return res * sign;
}
struct matrix
{
	int A[N][N];
	int n;
	void clr(int X)
	{
		for(int i = 1; i <= n; i++)
			for(int j = 1; j <= n; j++)
				A[i][j] = X;
	}
	matrix operator * (const matrix &X) const
	{
		matrix tmp = X;
		tmp.clr(0);
		for(int i = 1; i <= X.n; i++)
		{
			for(int kk = 1; kk <= X.n; kk++)
			{
				int pp = A[i][kk];
				for(int j = 1; j <= n; j++)
					tmp.A[i][j] = (tmp.A[i][j] + pp * X.A[kk][j]) % MOD;
			}
		}
		return tmp;
	}
}fir, ans;

signed main()
{
	fir.n = read();
	ans.n = fir.n;
	ans.clr(0);
	fir.clr(0);
	int k = read();
	for(int i = 1; i <= fir.n; i++)
		ans.A[i][i] = 1;
	for(int i = 1; i <= fir.n; i++)
	{
		for(int j = 1; j <= fir.n; j++)
			fir.A[i][j] = read();
	}
	while(k > 0)
	{
		if(k & 1)
			ans = ans * fir;
		if(k > 1)
			ans = ans * ans;
		k >>= 1;
	}
	for(int i = 1; i <= fir.n; i++)
	{
		for(int j = 1; j <= fir.n; j++)
			cout << ans.A[i][j] << " ";
		cout << endl;
	}
	return 0;
}

2024/8/14 17:33
加载中...