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;
}
话说这道题是绿题(。