一接过题来
不就是斐波那契数列吗
入门级
但是哦
数据范围是
int64
所以
只能用一个新的东西啦
矩阵快速幂
构建一个矩阵A
使矩阵f[n],f[n-1]*A=f[n+1],f[n]
那么我们只需要使f[2],f[1]*A^n-2
就能得到我们的f[n]
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#define mod 1000000007
using namespace std;
long long A1[3][3]=
{
0,0,0,
0,1,1,
0,1,0,
};
long long n,x,num[3]={0,1,1},bak[3][3],i,j,p,ans,mid[3];
void powA()
{
while(x>1)
{
p=x%2;
x=x/2;
if(p==1)
{
mid[1]=((num[1]*A1[1][1])%mod+(num[2]*A1[2][1])%mod)%mod;
mid[2]=((num[1]*A1[1][2])%mod+(num[2]*A1[2][2])%mod)%mod;
num[1]=mid[1];
num[2]=mid[2];
}
for(i=1;i<=2;i++)
for(j=1;j<=2;j++)
bak[i][j]=((A1[i][1]*A1[1][j])%mod+(A1[i][2]*A1[2][j])%mod)%mod;
for(i=1;i<=2;i++)
for(j=1;j<=2;j++)
A1[i][j]=bak[i][j];
}
}
int main()
{
scanf("%lld",&n);
if(n<=2)
{
printf("%lld",num[n]);
return 0;
}
x=n-2;
powA();
ans=((num[1]*A1[1][1])%mod+(num[2]*A1[2][1])%mod)%mod;
printf("%lld",ans);
return 0;
}