80分求助(玄关)
查看原帖
80分求助(玄关)
1199534
ycy1124楼主2024/5/21 13:18
#include<bits/stdc++.h>
using namespace std;
const int md=1e9+7;
long long a[4][4],ans[4]={0,1,1,1},base[4][4],bj1[4][4],bj2[4][4];
void work1(){
	for(int i=1;i<=3;i++){
		for(int j=1;j<=3;j++){
			bj2[i][j]=bj1[i][j];
			bj1[i][j]=0;
		}
	}
	for(int i=1;i<=3;i++){
		for(int j=1;j<=3;j++){
			for(int k=1;k<=3;k++){
				bj1[i][j]+=base[i][k]*bj2[k][j]%md;
			}
		}
	}
}
void work2(){
	for(int i=1;i<=3;i++){
		for(int j=1;j<=3;j++){
			bj2[i][j]=base[i][j];
			base[i][j]=0;
		}
	}
	for(int i=1;i<=3;i++){
		for(int j=1;j<=3;j++){
			for(int k=1;k<=3;k++){
				base[i][j]+=bj2[i][k]*bj2[k][j]%md;
			}
		}
	}
}
void nul(int n){
	while(n){
		if(n%2==1){
			work1();
		}
		work2();
		n/=2;
	}
}
int main()
{
	long long n;
	int t;
	scanf("%d",&t);
	a[1][1]=1;
	a[1][3]=1;
	a[2][1]=1;
	a[3][2]=1;
	while(t){
		t--;
		scanf("%lld",&n);
		for(int i=1;i<=3;i++){
			for(int j=1;j<=3;j++){
				base[i][j]=a[i][j];
				bj1[i][j]=1;
				bj2[i][j]=0;
			}
		}
		nul(n-5);
		long long da=0;
		for(int i=1;i<=3;i++){
			da+=ans[i]*bj1[i][1];
			da%=md;
		}
		printf("%lld\n",da);
	}
	return 0;
}

2024/5/21 13:18
加载中...