洛谷[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);//输出 }

浙公网安备 33010602011771号