【题解】P1962 斐波那契数列

P1962】题解

一:【题面】

求斐波那契第n项,n极大

二:【解法】

挺水的,F及base构造见代码,记得从F(2)开始

三:【代码】

#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
typedef long long LL;
struct mat{
	int a[3][3];
	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;
	}
};
int main(){
	LL n;cin>>n;
	if(n==1){
		cout<<1<<"\n";
		return 0;
	}
	mat F,base;
	F.a[1][1]=1;F.a[1][2]=1;
	F.a[2][1]=0;F.a[2][2]=0;
	base.a[1][1]=1;base.a[1][2]=1;
	base.a[2][1]=1;base.a[2][2]=0;
	n-=2;
	while(n){
		if(n&1) F=F*base;
		base=base*base;
		n>>=1;
	}
	cout<<F.a[1][1]<<"\n";
	return 0;
}
//dp[i]=dp[i-1]+dp[i-2]

//F(i)
//dp[i] dp[i-1]
//0     0

//F(2)
//1 1
//0 0 

//base
//1 1
//1 0
posted @ 2025-12-24 15:11  Ming3398  阅读(1)  评论(0)    收藏  举报