题目背景
大家都知道,斐波那契数列是满足如下性质的一个数列:
• f(1) = 1
• f(2) = 1
• f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数)
题目描述
请你求出 f(n) mod 1000000007 的值。
输入输出格式
输入格式:
·第 1 行:一个整数 n
输出格式:
第 1 行: f(n) mod 1000000007 的值
输入输出样例
输入样例#1:
5
输出样例#1:
5
输入样例#2:
10
输出样例#2:
55
说明
对于 60% 的数据: n ≤ 92
对于 100% 的数据: n在long long(INT64)范围内。
.
.
.
.
.
程序:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
long long mo=1000000007,n,a[2][2],ans[2][2],t[2][2];
void jzcf(long long x[2][2],long long y[2][2])
{
memset(t,0,sizeof(t));
for (int i=0;i<=1;i++)
for (int j=0;j<=1;j++)
for (int k=0;k<=1;k++)
t[i][j]=(((long long)x[i][k]*y[k][j])%mo+t[i][j]+mo)%mo;
for (int i=0;i<=1;i++)
for (int j=0;j<=1;j++)
x[i][j]=t[i][j];
}
int main()
{
scanf("%lld",&n);
a[0][0]=a[0][1]=a[1][0]=1;
a[1][1]=0;
ans[0][0]=ans[1][1]=1;
while (n)
{
if (n&1) jzcf(ans,a);
jzcf(a,a);
n>>=1;
}
printf("%lld",ans[0][1]%mo);
return 0;
}