- 我Viston就算是死,死这里,从这儿跳下去,我也不可能写高精度。
循环节最好用了....快读最好用了.....通项公式最好用了.......
通项公式:
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
于是我们就可以用这个公式+高精度取膜循环节(高精%低精可以直接在快读中进行)
见代码
#include<bits/stdc++.h> using namespace std; map<long long ,long long>mmp; //map优化递归求斐波拉契 long long a,b,c,d; long long dfs(long long a){ if(a==1) return 1; if(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)%100000000 : (dfs(a/2)*dfs(a/2)+dfs(a/2+1)*dfs(a/2+1))%100000000; } //通项公式求斐波拉契 inline long long read(){ long long X=0;char ch=getchar(); while(!isdigit(ch)) ch=getchar(); while(isdigit(ch)) X=(X*10+ch-'0')%150000000,ch=getchar(); return X; } //取%150000000直接在快速读入中进行 int main(){ a=read(); cout<<dfs(a+1); } //主程序真短