前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【题解】矩阵加速

【题解】矩阵加速

作者头像
fishhh
发布2022-12-02 11:51:01
2180
发布2022-12-02 11:51:01
举报
文章被收录于专栏:OI算法学习笔记

题目描述

输入格式

第一行一个整数 T,表示询问个数。

以下 T 行,每行一个正整数 n。

输出格式

每行输出一个非负整数表示答案。

输入输出样例

输入 #1

代码语言:javascript
复制
3
6
8
10

输出 #1

代码语言:javascript
复制
4
9
19

说明/提示

题目分析

代码实现

代码语言:javascript
复制
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
const int N=5;
const int M=1e9+7;
struct node{
	ll a[N][N]={0};
	int row,col;
};
node I;//单位矩阵

node matrixMins(node a,node b){//矩阵乘法
	node c;//答案矩阵
	c.row=a.row;
	c.col=b.col;
	int n=c.row,p=c.col,m=a.col;
	//计算矩阵乘法
	for(int i=1;i<=n;i++){
		for(int j=1;j<=p;j++){
			for(int k=1;k<=m;k++){
				c.a[i][j]+=a.a[i][k]*b.a[k][j]%M;
				c.a[i][j]%=M;
			}
		}
	}
	return c;
}
node matrixPow(node a,ll k){//矩阵的幂次方
	if(k==0){// 0次方
		return I;//矩阵的0次方是单位矩阵
	}
	node t=matrixPow(a,k/2);//求 a^{n/2} 次方
	if(k&1){//判断k是否是奇数
		return matrixMins(matrixMins(t,t),a);
	}else{//k是偶数
		return matrixMins(t,t);
	}
}
int main(){
	int t;
	node a;
	ll n;
	cin>>t;

	//处理 加速递推矩阵
	a=node{
		{
			{0},
			{0,0,0,1},
			{0,1,0,0},
			{0,0,1,1}
		},3,3
	};
	//处理 单位矩阵
	I=node{
		{
			{0},
			{0,1,0,0},
			{0,0,1,0},
			{0,0,0,1}
		},3,3
	};
	//处理数列初始值 [1 1 2 3]
	node tt={
		{
			{0},
			{0,0,1,1}
		},1,3
	};

	while(t--){
		cin>>n;
		node tmp=matrixPow(a,n);//计算A^n
		node ans=matrixMins(tt,tmp);
		cout<<ans.a[1][1]<<endl;		
	}
	return 0;
}

Q.E.D.

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述
  • 输入格式
  • 输出格式
  • 输入输出样例
  • 说明/提示
  • 题目分析
  • 代码实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档