Chgtaxihe's blog Chgtaxihe's blog
首页
练习
算法学习
读书笔记
小玩意

Chgtaxihe

首页
练习
算法学习
读书笔记
小玩意
  • 数论

    • 一些小问题
    • 二次剩余学习笔记
    • 卡特兰数学习笔记
    • 同余最短路学习笔记
    • 康托展开学习笔记
    • 快速傅里叶变换学习笔记
    • 拉格朗日插值学习笔记
    • 拓展欧几里得学习笔记
    • 斐波那契数列学习笔记
      • 前置知识
      • 通项公式
        • 狠人解法
        • 巧妙解法
      • Fibonacci数列的幂和
        • 例题 HDU 6755
      • 拓展问题1:
        • 解法
    • 斯特林数笔记
    • 本原勾股数组学习笔记
    • 模运算学习笔记
    • 欧拉函数
    • 类欧几里得学习笔记
    • 素性检测与大数分解
    • 素数计数问题
    • 组合数问题
    • 高斯整数学习笔记
  • 动态规划

  • 暴力

  • 图论

  • 数据结构

  • 字符串

  • 几何

  • 博弈论

  • 其他

斐波那契数列学习笔记

\newcommand\comb[2]{C_{#1}^{#2}}

# 斐波那契数列

令F(1)=F(2)=1F(1)=F(2)=1F(1)=F(2)=1,斐波那契数列的第iii项为F(i)=F(i−1)+F(i−2)F(i)=F(i-1)+F(i-2)F(i)=F(i−1)+F(i−2)

# 前置知识

二次剩余

等比数列求和公式: Sn=a11−qn1−q=a1−anq1−q(q≠1)\large S_n=a_1\frac{1-q^n}{1-q}=\frac{a_1-a_nq}{1-q}\ (q\ne 1)Sn​=a1​1−q1−qn​=1−qa1​−an​q​(q=1)

# 通项公式

Fn=15[(1+52)n−(1−52)n]\large{F_{n}=\frac{1}{\sqrt{5}}\left[\left(\frac{1+\sqrt{5}}{2}\right)^{n}-\left(\frac{1-\sqrt{5}}{2}\right)^{n}\right]} Fn​=5​1​[(21+5​​)n−(21−5​​)n]

通项求解过程见参考资料。

# 狠人解法

由递推公式可知

(FnFn+1)=(0111)(Fn−1Fn)\begin{pmatrix}F_n \\ F_{n+1}\end{pmatrix}=\begin{pmatrix} 0 & 1 \\ 1 & 1\end{pmatrix}\begin{pmatrix}F_{n-1} \\ F_{n}\end{pmatrix} (Fn​Fn+1​​)=(01​11​)(Fn−1​Fn​​)

对角化得

(0111)=(−1+5−1−522)(1+52001−52)(1251+545−125−1+545)\begin{pmatrix} 0 & 1 \\ 1 & 1\end{pmatrix}=\left(\begin{array}{cc}-1+\sqrt{5} & -1-\sqrt{5} \\2 & 2\end{array}\right)\left(\begin{array}{cc}\frac{1+\sqrt{5}}{2} & 0 \\0 & \frac{1-\sqrt{5}}{2}\end{array}\right)\left(\begin{array}{cc}\frac{1}{2 \sqrt{5}} & \frac{1+\sqrt{5}}{4 \sqrt{5}} \\-\frac{1}{2 \sqrt{5}} & \frac{-1+\sqrt{5}}{4 \sqrt{5}}\end{array}\right) (01​11​)=(−1+5​2​−1−5​2​)(21+5​​0​021−5​​​)(25​1​−25​1​​45​1+5​​45​−1+5​​​)

因此

Fn=(10)(−1+5−1−522)((1+52)n00(1−52)n)(1251+545−125−1+545)(01)F_n=\begin{pmatrix} 1 & 0\end{pmatrix}\left(\begin{array}{cc}-1+\sqrt{5} & -1-\sqrt{5} \\2 & 2\end{array}\right)\left(\begin{array}{cc}(\frac{1+\sqrt{5}}{2})^n & 0 \\0 & (\frac{1-\sqrt{5}}{2})^n\end{array}\right)\left(\begin{array}{cc}\frac{1}{2 \sqrt{5}} & \frac{1+\sqrt{5}}{4 \sqrt{5}} \\-\frac{1}{2 \sqrt{5}} & \frac{-1+\sqrt{5}}{4 \sqrt{5}}\end{array}\right)\begin{pmatrix}0 \\ 1\end{pmatrix} Fn​=(1​0​)(−1+5​2​−1−5​2​)((21+5​​)n0​0(21−5​​)n​)(25​1​−25​1​​45​1+5​​45​−1+5​​​)(01​)

计算得

Fn=(−1+5−1−5)((1+52)n00(1−52)n)(1+5455−145)=(1+52)n−(1−52)n5\begin{aligned}F_n&=\begin{pmatrix} -1+\sqrt{5} & -1-\sqrt{5}\end{pmatrix}\begin{pmatrix}(\frac{1+\sqrt{5}}{2})^n & 0 \\ 0 & (\frac{1-\sqrt{5}}{2})^n\end{pmatrix}\begin{pmatrix}\frac{1+\sqrt{5}}{4\sqrt{5}} \\\frac{\sqrt{5}-1}{4\sqrt{5}}\end{pmatrix}\\&=\frac{(\frac{1+\sqrt{5}}{2})^n-(\frac{1-\sqrt{5}}{2})^n}{\sqrt{5}}\end{aligned} Fn​​=(−1+5​​−1−5​​)((21+5​​)n0​0(21−5​​)n​)(45​1+5​​45​5​−1​​)=5​(21+5​​)n−(21−5​​)n​​

# 巧妙解法

核心:将相邻三项的递推关系转化为相邻两项的递推关系,进一步求出通项

记ai=F(i)a_i=F(i)ai​=F(i)

构造an+xan−1=y(an−1+xan−2)a_n+xa_{n-1}=y(a_{n-1}+xa_{n-2})an​+xan−1​=y(an−1​+xan−2​)

由an=an−1+an−2a_n=a_{n-1}+a_{n-2}an​=an−1​+an−2​可知{x=5−12y=5+12\left\{\begin{aligned} x&=\frac{\sqrt{5}-1}{2}\\ y&=\frac{\sqrt{5}+1}{2} \end{aligned}\right.⎩⎪⎪⎪⎨⎪⎪⎪⎧​xy​=25​−1​=25​+1​​为方程的一组解

令bn=an+5−12an−1b_n=a_n+\frac{\sqrt{5} - 1}{2}a_{n-1}bn​=an​+25​−1​an−1​,则bn=5+12bn−1b_n=\frac{\sqrt{5}+1}{2}b_{n-1}bn​=25​+1​bn−1​,b1=1b_1=1b1​=1,bn=(5+12)n−1b_n=(\frac{\sqrt{5}+1}{2})^{n-1}bn​=(25​+1​)n−1

至此,我们得到an+5−12an−1=(5+12)n−1a_n+\frac{\sqrt{5}-1}{2}a_{n-1}=(\frac{\sqrt{5}+1}{2})^{n-1}an​+25​−1​an−1​=(25​+1​)n−1,成功将相邻三项递推关系转化为相邻两项的递推关系。

继续拆分,设an+xbn=y(an−1+xbn−1)a_n+xb_n=y(a_{n-1}+xb_{n-1})an​+xbn​=y(an−1​+xbn−1​)

由上述过程可知,必有y=−5−12y=-\frac{\sqrt{5}-1}{2}y=−25​−1​,进而解得x=−5+125x=-\frac{\sqrt{5}+1}{2\sqrt{5}}x=−25​5​+1​

设cn=an−5+125bnc_n=a_n-\frac{\sqrt{5}+1}{2\sqrt{5}}b_ncn​=an​−25​5​+1​bn​,有cn=1−52cn−1c_n=\frac{1-\sqrt{5}}{2}c_{n-1}cn​=21−5​​cn−1​,c1=5−125c_1=\frac{\sqrt{5}-1}{2\sqrt{5}}c1​=25​5​−1​,cn=5−125(1−52)n−1c_n=\frac{\sqrt{5}-1}{2\sqrt{5}}(\frac{1-\sqrt{5}}{2})^{n-1}cn​=25​5​−1​(21−5​​)n−1

由此,可得an=cn+5+125bna_n=c_n+\frac{\sqrt{5}+1}{2\sqrt{5}}b_nan​=cn​+25​5​+1​bn​

代入可得

an=125(−2(1−52)n+2(1+52)n)a_n=\frac{1}{2\sqrt{5}}\left(-2(\frac{1-\sqrt{5}}{2})^{n}+2(\frac{1+\sqrt{5}}{2})^n\right) an​=25​1​(−2(21−5​​)n+2(21+5​​)n)


PS:化简太复杂了,直接心态爆炸

# Fibonacci数列的幂和

形如“给定n,kn,kn,k,求S=(F1k+F2k+⋯Fnk)mod(109+7)S=(F_1^k+F_2^k+\cdots F_n^k)\mod {(10^9+7)}S=(F1k​+F2k​+⋯Fnk​)mod(109+7)”的问题

# 例题 HDU 6755

题意:F0=0,F1=1,Fn=Fn−1+Fn−2F_0=0,F_1=1,F_n=F_{n-1}+F_{n-2}F0​=0,F1​=1,Fn​=Fn−1​+Fn−2​

给定个数字N,C,KN,C,KN,C,K,求

F0+FC+F2C+⋯+FNCF_{0}+F_{C}+F_{2C}+\cdots + F_{NC} F0​+FC​+F2C​+⋯+FNC​

(即是求∑i=0N(FiC)K\sum\limits_{i=0}^N{(\large F_{iC})^K}i=0∑N​(FiC​)K)

(1≤N,C≤1018,1≤K≤105)(1\le N,C\le 10^{18},1\le K \le 10^5)(1≤N,C≤1018,1≤K≤105)

答案对100000000910000000091000000009求余

# 解析

易知x2≡5mod(109+9)x^2\equiv 5\mod {(10^9 + 9)}x2≡5mod(109+9)的一个解为383008016383008016383008016(下文省略mod 符号)

记t=15≡276601605t=\frac{1}{\sqrt 5}\equiv 276601605t=5​1​≡276601605

已知

Fi=15((1+52)n−(1−52)n)F_i=\frac{1}{\sqrt 5}({(\frac{1+\sqrt{5}}{2})^n-(\frac{1-\sqrt{5}}{2})^n}) Fi​=5​1​((21+5​​)n−(21−5​​)n)

令a=1+52,b=1−52a=\frac{1+\sqrt{5}}{2},b=\frac{1-\sqrt{5}}{2}a=21+5​​,b=21−5​​

可以求得a≡691504013,b≡308495997a\equiv 691504013,b\equiv 308495997a≡691504013,b≡308495997

由于CCC的存在,我们令a=aC,b=bCa=a^C,b=b^Ca=aC,b=bC

那么

(Fi)k=tk(an−bn)k=tk∑i=0k[(−1)i\combki(an)k−i(bn)i]\begin{aligned}(F_i)^k&=t^k(a^n-b^n)^k\\&=t^k\sum_{i=0}^k\left[(-1)^i\comb{k}{i}(a^n)^{k-i}(b^n)^{i}\right]\end{aligned} (Fi​)k​=tk(an−bn)k=tki=0∑k​[(−1)i\combki(an)k−i(bn)i]​

那么有

∑n=1N(Fn)k=∑n=1Ntk∑i=0k(−1)i\combki(an)k−i(bn)i=tk∑i=0k(−1)i\combik∑n=1N(ak−ibi)n\begin{aligned}\sum_{n=1}^{N}(F_n)^k &= \sum_{n=1}^Nt^k\sum_{i=0}^k(-1)^i\comb{k}{i}(a^n)^{k-i}(b^n)^{i}\\&=t^k \sum_{i=0}^k (-1)^i\comb{i}{k} \sum_{n=1}^N (a^{k-i}b^i)^n\end{aligned} n=1∑N​(Fn​)k​=n=1∑N​tki=0∑k​(−1)i\combki(an)k−i(bn)i=tki=0∑k​(−1)i\combikn=1∑N​(ak−ibi)n​

令ui=ak−ibiu_i=a^{k-i}b^iui​=ak−ibi,使用等比数列求和公式(注意公比为1时,不可用求和公式)

∑n=1N(Fn)k={∑i=0k(−1)i\combikui(uiN−1)ui−1(ui≠1)∑i=0k(−1)i\combikN(ui=1)\sum_{n=1}^{N}(F_n)^k = \left\{\begin{aligned}&\sum_{i=0}^k (-1)^i\comb{i}{k}\frac{u_i(u_i^N-1)}{u_i-1} \quad (u_i\ne 1) \\&\sum_{i=0}^k (-1)^i\comb{i}{k}N\quad (u_i=1)\end{aligned}\right. n=1∑N​(Fn​)k=⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧​​i=0∑k​(−1)i\combikui​−1ui​(uiN​−1)​(ui​=1)i=0∑k​(−1)i\combikN(ui​=1)​

小细节:

  • 求组合数需要预处理出[1,105][1, 10^5][1,105]的阶乘及对应的逆元
  • 由于100000000910000000091000000009是质数,可以使用欧拉降幂降低复杂度(否则超时)

关键代码:

const int maxn = 1e5 + 1001;
const ll sqrt_5 = 383008016, inv_sqrt_5 = 276601605;
const ll mod = 1e9 + 9;
const ll x = 691504013, y = 308495997;

ll fact[maxn], inv_fact[maxn];

ll qpow(ll a, ll t){
    ll res = 1;
    while(t){
        if(t & 1) res = a * res % mod;
        t >>= 1, a = a * a % mod;
    }
    return res;
}

ll comb(int n, int k){
    if(k == 0 || k == n) return 1;
    return fact[n] * inv_fact[k] % mod * inv_fact[n - k] % mod;
}

void init(){
    fact[0] = inv_fact[0] = 1;
    for(int i=1; i<maxn; i++) fact[i] = fact[i - 1] * i % mod;
    inv_fact[maxn - 1] = qpow(fact[maxn - 1], mod - 2);
    for(int i=maxn-2; i>0; i--) inv_fact[i] = inv_fact[i + 1] * (i + 1) % mod;
}

void solve(){
    ll n, c, k, a, b;
    cin >> n >> c >> k;
    a = qpow(x, c), b = qpow(y, c);

    ll cur = 1, factor = qpow(a, mod - 2) * b % mod;
    for(int i=1; i<=k; i++) cur = cur * a % mod; 
    
    ll ans = 0, sum;
    for(int i=0; i<=k; i++){
        if(cur == 1) sum = n % mod;
        if(cur != 1) 
            sum = cur * ((qpow(cur, n % (mod - 1)) - 1 + mod) % mod) % mod * qpow((cur - 1 + mod) % mod, mod - 2) % mod;
        ans = (ans + (comb(k, i) * sum % mod) * (i & 1?-1:1) + mod) % mod;
        cur = cur * factor % mod;
    }
    ans = ans * qpow(inv_sqrt_5, k) % mod;
    cout << ans << '\n';
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

# 附

# 拓展问题1:

若F(i)=5F(i−1)+6F(i−2)F(i)=5F(i-1)+6F(i-2)F(i)=5F(i−1)+6F(i−2),F(0)=2,F(1)=1F(0)=2,F(1)=1F(0)=2,F(1)=1,求F(n)F(n)F(n)的通项公式.

# 解法

易知

(FiFi+1)=(0156)(Fi−1Fi)\begin{pmatrix}F_i \\F_{i+1}\\\end{pmatrix}=\begin{pmatrix} 0 & 1 \\ 5 & 6\end{pmatrix}\begin{pmatrix}F_{i-1} \\F_{i}\\\end{pmatrix} (Fi​Fi+1​​)=(05​16​)(Fi−1​Fi​​)

得特征方程λ2−6λ−5=0\lambda^2-6\lambda-5=0λ2−6λ−5=0,解得λ1=2,λ2=3\lambda_1=2,\lambda_2=3λ1​=2,λ2​=3

令F(n)=C1(−2)n+C2(−3)nF(n)=C_1(-2)^n+C_2(-3)^nF(n)=C1​(−2)n+C2​(−3)n,可知F(0)=C1+C2=2,F(1)=2C1+3C2=1F(0)=C_1+C_2=2,F(1)=2C_1+3C_2=1F(0)=C1​+C2​=2,F(1)=2C1​+3C2​=1

解得C1=5,C2=−3C_1=5,C_2=-3C1​=5,C2​=−3

因此F(n)=5(2)n−3(3)nF(n)=5(2)^n-3(3)^nF(n)=5(2)n−3(3)n


注意:此方法仅限特征无重根且均为实数根时可用。

# 参考

  • 斐波那契数列的通项公式推导-任所怀 (opens new window)
  • 斐波那契数列通项公式是怎样推导出来的? - Lancewu的回答 - 知乎 https://www.zhihu.com/question/25217301/answer/580609745
  • 斐波那契数列通项公式是怎样推导出来的? - 面无表情的仔仔的回答 - 知乎 https://www.zhihu.com/question/25217301/answer/158291644
  • 差分方程的求解 https://wenku.baidu.com/view/c9fdb47f6ad97f192279168884868762cbaebb08.html
上次更新: 2021/02/24, 03:37:30
拓展欧几里得学习笔记
斯特林数笔记

← 拓展欧几里得学习笔记 斯特林数笔记→

最近更新
01
深入理解Java虚拟机
03-04
02
DNS工作原理
02-27
03
改用VuePress啦
02-23
更多文章>
Theme by Vdoing | Copyright © 2019-2021
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式