【题解】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

浙公网安备 33010602011771号