数论——矩阵乘法 + P3390【模板】矩阵快速幂

本文详细解析了Luogu平台上的矩阵快速幂问题P3390,通过实例介绍了矩阵乘法基础和快速幂在解决此类问题中的应用。提供代码实现,并反思其在实际编程中的关键点,适合初学者和进阶者学习矩阵运算和算法优化。
摘要由CSDN通过智能技术生成

矩阵乘法 + Luogu:P3390 【模板】矩阵快速幂

题目

Luogu:P3390 【模板】矩阵快速幂

算法分析

这是一道板子题,开始之前我们来简单学习一下矩阵乘法

理解矩阵乘法

相信你对矩阵乘法已经有了初步的理解,如果看完上面那篇文仍然不太明白,下面这篇一定会让你豁然开朗;

P3390 【模板】矩阵快速幂

本题中的矩阵快速幂,在你理解过矩阵乘法后就很简单,一句话而已:
在这里插入图片描述
本人代码如下:

Code

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define ll long long 
#define rg register
using namespace std;
inline int sread()
{
	int x=0,f=1;char c=getchar();
	while(c>'9'||c<'0') {if(c=='-') f=-1;c=getchar();}
	while(c>='0'&&c<='9') {x=x*10+c-'0';c=getchar();}
	return f*x; 
}
const int p=1000000000+7;
int n;
ll k;
struct node{
	ll mp[105][105];
};
node mul(node a,node b)
{
	node c;
	for(rg int i=1;i<=n;++i)
	{
		for(rg int j=1;j<=n;++j)
		{ 
			c.mp[i][j]=0; 
			for(rg ll k=1;k<=n;++k)
			{
				c.mp[i][j]+=((a.mp[i][k]%p)*(b.mp[k][j]%p))%p;
			}
		}
	}
	return c;
}
node quickpow(node mp,ll b)
{
	node ans,base=mp;
	for(rg int i=1;i<=n;++i) ans.mp[i][i]=1;
	while(b)
	{
		if(b&1) ans=mul(ans,base);
		base=mul(base,base);
		b>>=1;
	}
	return ans;
}
int main()
{
	n=sread();	scanf("%lld",&k);
	node G,_ans;
	for(rg int i=1;i<=n;++i)
	{
		for(rg int j=1;j<=n;++j)
		{
			scanf("%lld",&G.mp[i][j]);
			G.mp[i][j]=G.mp[i][j]%p;
		}
	}
	_ans=quickpow(G,k);
	for(rg int i=1;i<=n;++i)
	{
		for(rg int j=1;j<=n;++j)
		{
			printf("%lld ",_ans.mp[i][j]%p);
		}
		printf("\n");
	}
	return 0;
} 

反思与总结

本题是一道板子题,只要充分理解并能熟练运用就好啦。还要在具体试题中去发现并且运用呀!

经典例题
Luogu:P1962 斐波那契数列
Luogu:P1349 广义斐波那契数列

经典例题 算法分析
数论——矩阵乘法 + P1962 斐波那契数列 + P1349 广义斐波那契数列

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值