斐波那契数列学习笔记
# 斐波那契数列
令,斐波那契数列的第项为
# 前置知识
二次剩余
等比数列求和公式:
# 通项公式
通项求解过程见参考资料。
# 狠人解法
由递推公式可知
对角化得
因此
计算得
# 巧妙解法
核心:将相邻三项的递推关系转化为相邻两项的递推关系,进一步求出通项
记
构造
由可知为方程的一组解
令,则,,
至此,我们得到,成功将相邻三项递推关系转化为相邻两项的递推关系。
继续拆分,设
由上述过程可知,必有,进而解得
设,有,,
由此,可得
代入可得
PS:化简太复杂了,直接心态爆炸
# Fibonacci数列的幂和
形如“给定,求”的问题
# 例题 HDU 6755
题意:
给定个数字,求
(即是求)
答案对求余
# 解析
易知的一个解为(下文省略mod 符号)
记
已知
令
可以求得
由于的存在,我们令
那么
那么有
令,使用等比数列求和公式(注意公比为1时,不可用求和公式)
小细节:
- 求组合数需要预处理出的阶乘及对应的逆元
- 由于是质数,可以使用欧拉降幂降低复杂度(否则超时)
关键代码:
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
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:
若,,求的通项公式.
# 解法
易知
得特征方程,解得
令,可知
解得
因此
注意:此方法仅限特征无重根且均为实数根时可用。
# 参考
- 斐波那契数列的通项公式推导-任所怀 (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