洛谷[P1962]斐波那契数列

这道题实际上用通项公式没有下面那些DALAO写的繁琐,11行代码AC。
什么是斐波拉契通项公式?
F[2n] = F[n+1]2-F[n-1]2 = (2F[n-1]+F[n])F[n]

F[2n+1] = F[n+1]2 + F[n]2

我们可以像优化普通递归的斐波拉契数列那样优化这个斐波拉契。
但开一个数组是不行的,于是我们想到了
$map$.
于是就可以过了....

#include<bits/stdc++.h>
std::map<long long ,int>mmp;
long long dfs(long long a){
    if(a==1||a==2) return 1;//返回条件
    if(mmp[a]!=0)  return mmp[a];   //如果已经存有值
    else return    mmp[a]=a%2==0?(dfs(a/2)+2*dfs(a/2-1))*dfs(a/2)%1000000007 :(dfs(a/2)*dfs(a/2)+dfs(a/2+1)*dfs(a/2+1))%1000000007;   //就是通项公式
}
int main(){
    long long a;std::cin>>a; //输入
    std::cout<<dfs(a);//输出
}

 

posted @ 2018-10-23 20:21  Viston  阅读(164)  评论(0)    收藏  举报