斐波那契
Posted 2462478392lee
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了斐波那契相关的知识,希望对你有一定的参考价值。
题意:给定整数n,求Fib[n]mod10000。0≤n≤2∗10^9
思路:[fn,fn+1]=[fn-1,fn]*[0,1,1,1];递推一下就得到 [fn,fn+1]=[0,1]*([0,1,1,1]^n)。
故用矩阵快速幂去求。
#include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<cmath> #include<map> #include<vector> #define ll long long using namespace std; const int mod=10000; ll n; void mul(int f[2],int a[2][2]) int c[2]; memset(c,0,sizeof(c)); for(int i=0;i<2;i++) for(int j=0;j<2;j++) c[i]=(c[i]+(ll)f[j]*a[j][i])%mod; memcpy(f,c,sizeof(c)); void mulself(int a[2][2]) int c[2][2]; memset(c,0,sizeof(c)); for(int i=0;i<2;i++) for(int j=0;j<2;j++) for(int k=0;k<2;k++) c[i][j]=(c[i][j]+(ll)a[i][k]*a[k][j])%mod; memcpy(a,c,sizeof(c)); int main() while(~scanf("%lld",&n)) if(n==-1) break; int f[2]=0,1; int a[2][2]=0,1,1,1; while(n) if(n&1) mul(f,a); mulself(a); n>>=1; printf("%d\n",f[0]);
以上是关于斐波那契的主要内容,如果未能解决你的问题,请参考以下文章