fib數列性質

  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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章