参见《具体数学第2版》244页。
原谅我这个可耻的链接————————
会整理一下在发出来
相关性质:
∑ni=0f(i)2=f(n)∗f(n+1) ;
gcd(fib(n),fib(m))=fib(gcd(n,m))
证明:可以通过反证法先证fibonacci数列的任意相邻两项一定互素,然后可证n>m时gcd(fib(n),fib(m))=gcd(fib(n-m),fib(m)),递归gcd(fib(n),fib(m))=gcd(fib(k),fib(l)),最后k=l,不然继续递归。K是通过展转相减法求出,易证k=gcd(n,m),所以
∑ni=0f(i)=f(n+2)−1
∑nk=1f(2k−1)=f(2n)
∑nk=1f(2k)=f(2n+1)−1
∑nk=0(−1)n⋅f(n)=(−1)n⋅(f(n+1)−f(n))+1
- f(n+m)=f(n+1)⋅f(m)+f(n)∗f(m−1)
- 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)
- 若 x∣fib(k) ,则 x∣fib(k∗i)
- f(m+n−1)=f(m−1)⋅f(n−1)+f(m)⋅f(n)
- f[91]=7540113804746346429小于longlong的最大值,f[45]=1836311903小于int的最大值
还有一个结论:
计算(a/b)%c 其中b能整除a
如果b与c互素,则(a/b)%c=a*b^(phi(c)-1)%c
如果b与c不互素,则(a/b)%c=(a%bc)/b
对于b与c互素和不互素都有(a/b)%c=(a%bc)/b成立
常用求法
- 矩阵快速幂,构造的矩阵为
0111
矩阵的n次方,fib(n-1)=[1][1],fib(n)=[1][2]=[2][1],fib(n+1)=[2][2]。
struct Mat{
int ma[2][2];
Mat(){}
void unit(){
m[0][0]=1;
m[0][1]=0;
m[1][0]=0;
m[1][1]=1;
}
};
Mat add(Mat a,Mat b)
{
Mat res;
for(int i=0; i<2; i++)
for(int j=0; j<2; j++)
res.ma[i][j] =(a.ma[i][j] + b.ma[i][j])%m;
return res;
}
Mat multi(Mat a,Mat b){
Mat res;
for(int i=0; i<2; i++)
{
for(int j=0; j<2; j++)
{
res.ma[i][j] = 0;
for(int k=0; k<2; k++)
res.ma[i][j] =(res.ma[i][j]+a.ma[i][k] * b.ma[k][j]%m)%m;
}
}
return res;
}
Mat power(Mat a,int b){
Mat ans;
ans=ans.unit(n);
while(b)
{
if(b & 1)
ans = multi(ans,a);
a = multi(a,a);
b >>= 1;
}
return ans;
}
- 大数
int fibn[510][150];
char fibc[510][150];
void fibo(){
fibn[0][0]=1;
fibn[0][1]=1;
fibn[1][0]=1;
fibn[1][1]=1;
for(int i=2;i<=500;++i){
int tmp=max(fibn[i-1][0],fibn[i-2][0]);
for(int j=1;j<=tmp;++j){
fibn[i][j]+=fibn[i-1][j]+fibn[i-2][j];
fibn[i][j+1]+=fibn[i][j]/10;
fibn[i][j]%=10;
}
if(fibn[i][tmp+1]!=0) ++tmp;
fibn[i][0]=tmp;
}
for(int i=0;i<=500;++i){
int tmp=fibn[i][0];
for(int j=1;j<=tmp;++j)
fibc[i][tmp-j+1]=fibn[i][j]+'0';
fibc[i][tmp+1]='\0';
fibc[i][0]=tmp;
}
}