P1962 斐波那契数列

做过先前几道,这个纯纯模板题,十分钟过。

#include <bits/stdc++.h>
#define ll long long
#define re register
using namespace std;
const int N=800, INF=0x3f3f3f3f,mod=1e9+7;
ll A[3][3];
ll ans[3][3];
void f1(){//ans*a
	ll B[3][3]={0};
	for(int i=1;i<=2;i++)
		for(int j=1;j<=2;j++)
			for(int k=1;k<=2;k++)
				B[i][j]=(B[i][j]+ans[i][k]*A[k][j])%mod;
	for(int i=1;i<=2;i++)
		for(int j=1;j<=2;j++)
			ans[i][j]=B[i][j];
}
void f2(){//a*a
	ll B[3][3]={0};
	for(int i=1;i<=2;i++)
		for(int j=1;j<=2;j++)
			for(int k=1;k<=2;k++)
				B[i][j]=(B[i][j]+A[i][k]*A[k][j])%mod;
	for(int i=1;i<=2;i++)
		for(int j=1;j<=2;j++)
			A[i][j]=B[i][j];
}
ll FIB(ll k){
	if(k<=2)return 1;
	ans[1][1]=1;ans[1][2]=1;
	A[1][1]=1;A[1][2]=1;A[2][1]=1;
	k-=2;
	while(k>0){
		if(k&1)f1();
		f2();
		k>>=1;
	}
	return ans[1][1]%mod;
}
int main(){
	ll n;cin>>n;
	cout<<FIB(n);
	return 0;
}

话说这道题是绿题(。

posted @ 2023-07-13 15:36  LsmQwQ  阅读(11)  评论(0)    收藏  举报