听灌佬多(矩阵加速递推题)
  • 板块灌水区
  • 楼主eternal_silence
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/2/4 19:34
  • 上次更新2025/2/5 08:40:17
查看原帖
听灌佬多(矩阵加速递推题)
740311
eternal_silence楼主2025/2/4 19:34

题目 矩阵套矩阵 吧

不知道是不是代码写丑了,只能过杨丽和第一个点

玄关求条(球球了)

#include <bits/stdc++.h>
#define ll long long

using namespace std;

ll n,k,m,a[40][40];
struct Matrix{
	ll n,m;
	ll d[80][80];
	Matrix(){memset(d,0,sizeof(d)),n=0,m=0;}
	Matrix operator * (const struct Matrix &aa)const
	{
		Matrix res;
		res.n=n;res.m=aa.m;
		for(ll i=1;i<=res.n;i++)
		{
			for(ll j=1;j<=res.m;j++)
			{
				for(ll k=1;k<=m;k++)
				{
					res.d[i][j]+=d[i][k]*aa.d[k][j];
					res.d[i][j]%=m;
				}
			}
		}
		return res;
	}
};

int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n>>k>>m;
	for(ll i=1;i<=n;i++)
	{
		for(ll j=1;j<=n;j++)
		{
			cin>>a[i][j];
		}
	}
	Matrix x,y;
	for(ll i=1;i<=n;i++)
	{
		for(ll j=1;j<=n;j++)
		{
			y.d[i][j]=a[i][j];
			y.d[i+n][j]=a[i][j];
		}
		y.d[i+n][i+n]=1;
	}
	y.n=2*n,y.m=2*n;
	for(int i=1;i<=2*n;i++)
	{
		x.d[i][i]=1;
	}
	x.n=2*n,x.m=2*n;
	while(k)
	{
		if(k&1)x=x*y;
		y=y*y;
		k>>=1;
	}
	for(ll i=1;i<=n;i++)
	{
		for(ll j=1;j<=n;j++)
		{
			cout<<x.d[i+n][j]%m<<' ';
		}
		cout<<endl;
	}
	return 0;
}
2025/2/4 19:34
加载中...