CSP.ac 乘積求和

題目描述

組合數 C(n,m)是從 n 個物品中取 m 個的方案數。
\(\displaystyle C(n,m) = \frac {n!}{m!(n-m)!}\)
斐波那契數列 F 滿足,\(F[0]=F[1]=1,n≥2 時 F[n]=F[n-1]+F[n-2]\)
給出 n,求 \(C(n,0)F[0]+C(n,1)F[1]+...+C(n,n)F[n]\)

solution

題目也就是讓你求這麼一個東西:
\(\displaystyle \sum_{i = 0}^{n} {n\choose i}f[i]\)
由斐波那契數列的通項公式:
\(\displaystyle f[n] = \frac{1}{\sqrt 5}((\frac {1 + \sqrt 5}{2}) ^n -(\frac {1 - \sqrt 5}{2}) ^n)\)
然後上邊的式子就變成了
\(\displaystyle \sum_{i = 0}^{n} {n\choose i} \frac{1}{\sqrt 5}((\frac {1 + \sqrt 5}{2}) ^i -(\frac {1 - \sqrt 5}{2}) ^i)\)

\(= \frac{1}{\sqrt 5} \displaystyle \sum_{i = 0}^{n} {n\choose i} ((\frac {1 + \sqrt 5}{2}) ^i -(\frac {1 - \sqrt 5}{2}) ^i)\)

\(= \frac{1}{\sqrt 5}( \displaystyle \sum_{i = 0}^{n} {n\choose i} (\frac {1 + \sqrt 5}{2}) ^i - \sum_{i = 0}^{n} {n\choose i}(\frac {1 - \sqrt 5}{2}) ^i) \ \ \ \ \ ①\)

由二項式定理(二項式定理暴拆證明):

\((a + b) ^n = \displaystyle \sum _{k = 0}^{n} {n \choose k} a^{n - k}b^k\)

\(a == 1\) 原式:

\((1 + b) ^n = \displaystyle \sum _{k = 0}^{n} {n \choose k} b^k\)

然後我們回頭看①,把上邊式子帶入可得:

\(=\displaystyle \frac{1}{\sqrt 5}((1 + \frac {1 + \sqrt 5}{2}) ^n - (1+\frac {1 - \sqrt 5}{2}) ^n)\)

$=\displaystyle \frac{1}{\sqrt 5}((\frac {3 + \sqrt 5}{2})^n - (\frac {3 - \sqrt 5}{2}) ^n) $

\(=\displaystyle \frac{1}{\sqrt 5}((\frac {6 + 2\sqrt 5}{4})^n - (\frac {6 - 2\sqrt 5}{4}) ^n)\)

\(=\displaystyle \frac{1}{\sqrt 5}((\frac {1 + 2\sqrt 5 + 5}{4}) ^n - (\frac {1 - 2\sqrt 5+5}{4}) ^n)\)

\(=\displaystyle \frac{1}{\sqrt 5}(((\frac {1 + \sqrt 5}{2})^2) ^n - ((\frac {1 - \sqrt 5}{2})^2) ^n)\)

\(=\displaystyle \frac{1}{\sqrt 5}((\frac {1 + \sqrt 5}{2})^{2n} - (\frac {1 - \sqrt 5}{2})^{2n})\)

孩子回頭看看上邊斐波那契數列的通項公式吧,有驚喜呦

沒錯,最後的答案就是斐波那契數列的第2n項

code

/*
	Auther:_Destiny
	time:2020 4 28
*/
#include <bits/stdc++.h>
#define ll long long
#define N 2000010
#define M 1010

using namespace std;
const int mod = 1e9 + 7;
ll f[N];

ll read() {
	ll s = 0, f = 0; char ch = getchar();
	while (!isdigit(ch)) f |= (ch == '-'), ch = getchar();
	while (isdigit(ch)) s = s * 10 + (ch ^ 48), ch = getchar();
	return f ? -s : s;
}

int main() {
	f[0] = f[1] = 1;
	for (int i = 2; i <= 2000000; ++i) 
		f[i] = (f[i - 1] + f[i - 2]) % mod;
	int T = read();
	while (T--) {
		int n = read();
		printf("%lld\n", f[2 * n]);
	} 
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章