您的位置:首页 > 其它

fib数列性质

2015-01-22 11:27 316 查看
f(0)+f(1)+f(2)+…+f(n)=f(n+2)-1。
f(1)+f(3)+f(5)+…+f(2n-1)=f(2n)。
f(2)+f(4)+f(6)+…+f(2n) =f(2n+1)-1。
[f(0)]^2+[f(1)]^2+…+[f(n)]^2=f(n)·f(n+1)。
f(0)-f(1)+f(2)-…+(-1)^n·f(n)=(-1)^n·[f(n+1)-f(n)]+1。
f(m+n-1)=f(m-1)·f(n-1)+f(m)·f(n)。
[f(n)]^2=(-1)^(n-1)+f(n-1)·f(n+1)。
f(2n-1)=[f(n)]^2-[f(n-2)]^2。
3f(n)=f(n+2)+f(n-2)。
f(2n-2m-2)[f(2n)+f(2n+2)]=f(2m+2)+f(4n-2m) [ n〉m≥-1,且n≥1]
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
|
|f
f[n+1]|
利用矩阵快速幂即能在O(lg n)的时间能求出f


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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: