写这个类型博客的目的就是想总结一下某个专题的知识点,方便以后比赛前复习,由于太菜,如有错误,还请斧正。
首先斐波那契数列的定义在这就不讲了,不了解的请自行百度。
先来讲讲斐波那契数列的几种常见算法:
一、递归法(O(2^n))几乎没用
二、迭代法(O(n)) 对于查询次数*max(n)<=1e8有用
三、矩阵快速幂(O(log(n)))基本就靠他了
typedef unsigned long long ll;
const int mod=1e9+7;
typedef vector<ll> vec;
typedef vector<vec> mat;
mat mul(mat &a,mat &b)
{
mat c(a.size(),vec(b[0].size()));
for(int i=0; i<2; i++)
{
for(int j=0; j<2; j++)
{
for(int k=0; k<2; k++)
{
c[i][j]+=a[i][k]*b[k][j];
//c[i][j]%;
}
}
}
return c;
}
mat pow(mat a,ll n)
{
mat res(a.size(),vec(a.size()));
for(int i=0; i<a.size(); i++)
res[i][i]=1;//单位矩阵;
while(n)
{
if(n&1) res=mul(res,a);
a=mul(a,a);
n/=2;
}
return res;
}
ll solve(ll n)
{
mat a(2,vec(2));
a[0][0]=1;
a[0][1]=1;
a[1][0]=1;
a[1][1]=0;
a=pow(a,n);
return a[0][1];//也可以是a[1][0];
}
四、通项公式法 虽然快但不一定准确,有精度问题
fib(n) = pow(((1 + sqrt(5)) / 2.0),n) / sqrt(5) - pow(((1 -sqrt(5)) / 2.0),n) / sqrt(5));
接下来是我做题目过程中遇到的以及网上查到的关于斐波那契数列的一些小性质
1、
2、
3、
4、
5、if(F(x)%k==0) F(x*i)%k=0
6、
7、
8、
9、
10、
11、在模的情况下,斐波那契数列会出现循环,可以打表找出
可能以后还会有加减