首页 > 技术文章 > 斐波那契是我见过最神奇的东西

whcxyp20070320 2021-11-24 20:27 原文

先上个最最朴素的小代码
f[1]=1; f[2]=1; for(int i=3;i<=n;i++) f[i] = f[i-1]+f[i-2];

高精板子

点击查看代码
#include <bits/stdc++.h>
using namespace std;
char sum[1200];
int s=0,m=0,n;
int main()
{
    cin>>n;
    string s1,s2;
    int a[1200],b[1200];
    int he,i;
    s1="0";
    s2="1";
    for(m=2;m<n+1;m++)
    {
        memset(a,0,sizeof a);
        memset(b,0,sizeof b);
        a[0]=s1.length();
        for(i=1;i<=a[0];i++)
        {
            a[i]=s1[a[0]-i]-'0';
        }
        b[0]=s2.length();
        for(i=1;i<=b[0];i++)
        {
            b[i]=s2[b[0]-i]-'0';
        }
        he=(a[0]>b[0]?a[0]:b[0]);
        for(i=1;i<=he;i++)
        {
            a[i]+=b[i];
            a[i+1]+=a[i]/10;
            a[i]%=10;
        }
        he++;
        while((a[he]==0)&&(he>1))
        he--;
            for(i=he,s=0;i>=1;i--,s++)
            {
                sum[s]=a[i]+'0';
            }
        s1=s2;
        s2=sum;
    }
    cout<<s2<<endl;
    return 0;
}

一些神奇的性质

  • 平方与前后项
    从第二项开始 (右移一位,第一项为1,第二项为2...)
    每个偶数项的平方都比前后两项之积多 1
    每个奇数项的平方都比前后两项之积少 1
    比如说
    第二项 1 的平方比它的前一项 1 和它的后一项 2 的积 2 少 1
    第三项 2 的平方比它的前一项 1 和它的后一项 3 的积 3 多 1。
    (注:奇数项和偶数项是指项数的奇偶)

  • 与集合子集
    // f(n+2)项同时也代表了集合 {1,2,3,.....,n} 中所有不包含相邻正整数的子集个数。

  • 奇数项求和
    a1+a3+a5+a7+.....+a(2n-1)=a(2n);

  • 偶数项求和
    a2+a4+a6+a8+.....+a(2n)=a(2n+1)-1;
    其实用这一性质A题还是很爽的P1962

点击查看代码
#include<cstdio>
#include<map>
using namespace tsd;
typedef long long ll;
const int M=1e9+7;//取模 
map<ll,ll>a; 
ll g(ll x)  { return x*x%M; }//平方 
ll f(ll x){
	if(x==1||x==2)	a[x]=1;//边界 
	if(!a[x])//记忆化保存 
		if(x&1)	a[x]=g(f(x+1>>1))+g(f(x-1>>1));//x为奇数 
		else a[x]=g(f(x>>1))+2*f(x>>1)*f((x>>1)-1);//x为偶数 
	return a[x]%M;
}
int main(){
	LL n;
	scanf("%lld",&n);
	printf("%lld",f(n));
	return 1;
}
  • 平方求和
    1-n项的平方和=a(n)*a(n+1);

  • 两倍项关系
    a(2n)/a(n)=a(n-1)+n(n+1);

  • 其他公式
    a(n-1)*a(n+1)-[a(n)]平方=(-1)n次方;

当然不能少了推广
就比如说斐波那契--卢卡斯数列
把f(2)改个数就完了 而且任意几个卢卡斯数列相减就是斐波那契数列了

通项公式及应用
还是用线性递推方程x2=x+1因为其他的看不懂
特征方程传送门
递推数列传送门
类似的,一枚均匀的硬币掷10次,问不连续出现正面的可能情形有多少种?
image

距离上次写这个东西已经过去了正好一个月,但我那时看上的P1962还是没有切掉。由于还开不了矩阵就只好扩域或记忆化+减半递推

推荐阅读