斐波那契数列

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();
}

 

posted @ 2017-03-27 10:47  TRTTG  阅读(333)  评论(1编辑  收藏  举报