【题解】P1939 矩阵加速(数列)

P1939】题解

一:【题面】

二:【解法】

F,base构造见代码

三:【代码】

#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
typedef long long LL;
struct mat{
	int a[4][4];
	mat(){
		memset(a,0,sizeof a);
	}
	mat operator*(mat b){
		mat ans;
		for(int i=1;i<=3;i++)
			for(int j=1;j<=3;j++)
				for(int k=1;k<=3;k++){
					ans.a[i][j]+=1LL*a[i][k]*b.a[k][j]%mod;
					ans.a[i][j]%=mod;
				}
		return ans;
	}
};
void solve(){
	int n;cin>>n;
	if(n<=3){
		cout<<1<<"\n";
		return ;
	}
	n-=3;
	mat F,base;
	F.a[1][1]=1;F.a[1][2]=1;F.a[1][3]=1;
	F.a[2][1]=0;F.a[2][2]=0;F.a[2][3]=0;
	F.a[3][1]=0;F.a[3][2]=0;F.a[3][3]=0;
	base.a[1][1]=1;base.a[1][2]=1;base.a[1][3]=0;
	base.a[2][1]=0;base.a[2][2]=0;base.a[2][3]=1;
	base.a[3][1]=1;base.a[3][2]=0;base.a[3][3]=0;
	while(n){
		if(n&1) F=F*base;
		base=base*base;
		n>>=1;
	}
	cout<<F.a[1][1]<<"\n";
	return ;
}
int main(){
	int t;cin>>t;
	while(t--) solve();
	return 0;
}
//dp[i]=dp[i-1]+dp[i-3]

//F[i]
//dp[i] dp[i-1] dp[i-2]
//0     0       0
//0     0       0

//base
//1 1 0
//0 0 1
//1 0 0

//F[3]
//1 1 1
//0 0 0
//0 0 0
posted @ 2025-12-24 15:21  Ming3398  阅读(24)  评论(0)    收藏  举报