fib数列性质

来源:互联网 发布:google chrome翻墙mac 编辑:程序博客网 时间:2024/04/27 19:40
  1. f(0)+f(1)+f(2)+…+f(n)=f(n+2)-1。 
  2. f(1)+f(3)+f(5)+…+f(2n-1)=f(2n)。 
  3. f(2)+f(4)+f(6)+…+f(2n) =f(2n+1)-1。 
  4. [f(0)]^2+[f(1)]^2+…+[f(n)]^2=f(n)·f(n+1)。 
  5. f(0)-f(1)+f(2)-…+(-1)^n·f(n)=(-1)^n·[f(n+1)-f(n)]+1。 
  6. f(m+n-1)=f(m-1)·f(n-1)+f(m)·f(n)。 
  7. [f(n)]^2=(-1)^(n-1)+f(n-1)·f(n+1)。 
  8. f(2n-1)=[f(n)]^2-[f(n-2)]^2。 
  9. 3f(n)=f(n+2)+f(n-2)。 
  10. f(2n-2m-2)[f(2n)+f(2n+2)]=f(2m+2)+f(4n-2m) [ n〉m≥-1,且n≥1] 
  11.  f(2n+1)=[f(n)]^2+[f(n+1)]^2.
快速求fib数,
令base = |0 1| 即 |f[0] f[1]|
|1 1|     |f[1] f[2]|
那么 res = base^n = |f[n-1]    f[n] |
 |f[n]    f[n+1]|
利用矩阵快速幂即能在O(lg n)的时间能求出f[n]。

struct node{    long long fib[2][2];    node(){    fib[0][0] = 0,    fib[1][1] = fib[0][1] = fib[1][0] = 1;    }};const int mod = 1000000007;node mutil(const node &a, const node &b){    node tmp;    for(int i = 0; i < 2; i++){    for(int j = 0; j < 2; j++){    tmp.fib[i][j] = 0;    for(int k = 0; k <2; k ++){    tmp.fib[i][j] = (tmp.fib[i][j] +(a.fib[i][k]%mod *b.fib[k][j]%mod)%mod)%mod;    }    }    }    return tmp;}long long Fib(long long n){    node res;    node base;while(n){if(n&1){res = mutil(res, base);}base = mutil(base, base);n >>= 1;}return (res.fib[0][0])%mod;}


0 0