关于思路上的疑惑
查看原帖
关于思路上的疑惑
572587
cmrhhh楼主2024/5/13 19:37

先讲想法:蒟蒻的矩阵构造代码里有,蒟蒻想着已经有了a1,a2,a3,那么直接做(n-3)次矩阵左乘,然后答案在A.a[0][0]*a1+A.a[0][2]*a3,其中a1,a3都是1,可是最后答案错了,debug时意外发现AC代码,求助大佬蒟蒻思路上的错误在哪,贴AC代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod=1e9+7;
int t,n;
struct Matrix{
	int a[3][3]={{1,0,1},
				 {1,0,0},
				 {0,1,0}};
	friend Matrix operator *(Matrix o,Matrix p ){
		Matrix ans;
		memset(ans.a,0,sizeof ans.a); 
		for(int i=0;i<3;++i)
			for(int j=0;j<3;++j)
				for(int k=0;k<3;++k)
					(ans.a[i][j]+=o.a[i][k]*p.a[k][j]%mod)%=mod;
		return ans;
	}
	Matrix operator^(int k){
		--k;
		Matrix ans=*this,A=*this;
		while(k){
			if(k&1)ans=ans*A;
			k>>=1;
			A=A*A;
		}
		return ans;
	}
};
signed main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>t;
	while(t--){
		cin>>n;
		if(n>=1&&n<=3){
			cout<<1<<"\n";
			continue;
		}
		Matrix A;
		A=A^(n-1);
		//for(int i=0;i<3;++i)for(int j=0;j<3;++j)cout<<A.a[i][j]<<" \n"[j==2];
		cout<<(A.a[0][0])%mod<<"\n";
	}
	return 0;
}
2024/5/13 19:37
加载中...