月落乌啼算钱(斐波那契数列)
题目背景
(本道题目木有隐藏歌曲……不用猜了……)
《爱与愁的故事第一弹·heartache》最终章。
吃完 pizza,月落乌啼知道超出自己的预算了。为了不在爱与愁大神面前献丑,只好还是硬着头皮去算钱……
题目描述
算完钱后,月落乌啼想着:“你 TMD 坑我,(以下用闽南语读)归粒靠杯靠亩诶,(以下用英读)是伊特游!”于是当爱与愁大神问多少钱时,月落乌啼说了一堆乱码。爱与愁大神说:“算了算了,我只问第n样菜价格多少?”月落乌啼写出了:
由于爱与愁大神学过编程,于是就用 11 分钟的时间求出了 Fn 的结果。月落乌啼为此大吃一惊。你能学学爱与愁大神求出Fn的值吗?
输入格式
一行一个自然数 n。
输出格式
只有 1 行一个实数Fn ,保留两位小数。
输入输出样例
输入 #1复制
6
输出 #1复制
8.00
说明/提示
对于所有数据:0≤n≤48。
特征方程求通式高数内容我记得,好像高中数学也有这个吧,有点记不清了。给大家附上公式图
斐波那契的递推公式为
a
n
=
a
n
+
2
−
a
n
+
1
a_{n} = a_{n+2}-a_{n+1}
an=an+2−an+1
可写成
a
n
+
2
−
a
n
+
1
−
a
n
=
0
a_{n+2}-a_{n+1}-a_{n}=0
an+2−an+1−an=0
其特征方程为
x
2
−
x
−
1
=
0
x^2-x-1=0
x2−x−1=0解得
x
1
=
1
+
5
2
x_1=\dfrac{1+\sqrt{5}}{2}
x1=21+5
x
2
=
1
−
5
2
x_2=\dfrac{1-\sqrt{5}}{2}
x2=21−5
因为x1和x2不相等所以原通项公式为
a n = A ∗ x 1 n + B ∗ x 2 n a_n=A*x_1^n+B*x_2^n an=A∗x1n+B∗x2n
带入第一项x1与第二项x2
{
a
n
=
A
∗
x
1
1
+
B
∗
x
2
1
a
n
=
A
∗
x
1
2
+
B
∗
x
2
2
\begin{cases} a_n=A*x_1^1+B*x_2^1 \\ a_n=A*x_1^2+B*x_2^2 \end{cases}
{an=A∗x11+B∗x21an=A∗x12+B∗x22
求解可得
{
A
=
1
5
B
=
−
1
5
\begin{cases} A=\dfrac{1}{\sqrt{5}} \\ B=-\dfrac{1}{\sqrt{5}} \end{cases}
⎩⎪⎨⎪⎧A=51B=−51
因此代入得
a
n
=
(
1
+
5
2
)
n
−
(
1
−
5
2
)
n
5
a_n=\dfrac{(\dfrac{1+\sqrt{5}}{2})^n-(\dfrac{1-\sqrt{5}}{2})^n}{\sqrt{5}}
an=5(21+5)n−(21−5)n
与题目给出的公式相同,所以这个就是斐波那契数列。我们可以用斐波那契数列公式作答。
AC代码(C++)
#include <iostream>
using namespace std;
int main()
{
int n;
//int 会爆掉
unsigned long long a = 1, b = 1, c = 0;
cin >> n;
for (int i = 3; i <= n; i++)
{
c = a + b;
a = b;
b = c;
}
//因为已经知道了答案是斐波那契数列那就不会有特殊的小数点数
//所以为了满足题目要求顺带输出".00"就好了。
cout << c << ".00" << endl;
return 0;
}