您的位置:首页 > 其它

斐波那契数列

2017-03-27 10:47 246 查看

https://luogu.lohu.info/problem/show?pid=1962

题目背景

大家都知道,斐波那契数列是满足如下性质的一个数列:

• 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)范围内。

矩阵快速幂

问题转化为求

1 1 的 n-2 次方 (n>2)

1 0

#include<cstdio>
#include<cstring>
#define mod 1000000007
using namespace std;
long long a[3][3],ans[3][3],tmp[3][3];
long long n;
void mul(long long s1[3][3],long long s2[3][3])
{
memset(tmp,0,sizeof(tmp));
for(int i=1;i<=2;i++)
for(int j=1;j<=2;j++)
for(int k=1;k<=2;k++)
tmp[i][j]=(tmp[i][j]+s1[i][k]*s2[k][j])%mod;
for(int i=1;i<=2;i++)
for(int j=1;j<=2;j++)
s1[i][j]=tmp[i][j];
}
void solve()
{
n-=2;
for(;n;n>>=1,mul(a,a))
if(n&1) mul(ans,a);
printf("%lld\n",ans[1][1]);
}
int main()
{
scanf("%lld",&n);
if(n==0)
{
printf("0\n");
return 0;
}
if(n==1||n==2)
{
printf("1\n");
return 0;
}
a[1][1]=1;a[1][2]=1;
a[2][1]=1;a[2][2]=0;
ans[1][1]=1;ans[1][2]=1;
ans[2][1]=1;ans[2][2]=0;
solve();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: