80分求助
查看原帖
80分求助
148092
Dark_lightrq楼主2022/8/25 20:01

2WA 10TLE

#include<bits/stdc++.h>
#define LL long long
#define RE register
using namespace std;
const LL mod=1000000007; 
LL n;
LL f[3]={0,1,1},a[3][3],ans[3][3],s[3][3];
int main(){
	cin>>n;
	if(n==1){
		cout<<1;
		return 0;
	}
	a[1][1]=a[2][1]=a[1][2]=1;
	ans[1][1]=ans[2][2]=1;
	int k=n-2;
	for(;k;k>>=1){
		if(k&1){
			for(RE int i=1;i<=2;i++){
				for(RE int j=1;j<=2;j++){
					for(RE int k=1;k<=2;k++){
						s[i][j]=(s[i][j]+ans[i][k]*a[k][j])%mod;
					}
				}
			}
			for(RE int i=1;i<=2;i++){
				for(RE int j=1;j<=2;j++){
					ans[i][j]=s[i][j];
					s[i][j]=0;
				}
			}
		}
		for(RE int i=1;i<=2;i++){
			for(RE int j=1;j<=2;j++){
				for(RE int k=1;k<=2;k++){
					s[i][j]=(s[i][j]+a[i][k]*a[k][j])%mod;
				}
			}
		}
		for(RE int i=1;i<=2;i++){
			for(RE int j=1;j<=2;j++){
				a[i][j]=s[i][j];
				s[i][j]=0;
			}
		}
	}
	cout<<(ans[1][1]+ans[2][1])%mod;
	return 0;
}
2022/8/25 20:01
加载中...