「模拟赛20190329」作业 泰勒展开

题目描述

小W的数学老师总是喜欢布置计算题作为业,小W却只对证明题感兴趣。
这一次,小W的数学老师布置了一道计算题:
已知递推公式
\(f_n=1-nf_{n-1}(n>0)\)
\(f_0=1-e\)
对于老师给定的\(n\),小W需要计算\(f_n\)。小W认为这个作业非常简单而且无聊,所以他找到了你,希望你能帮助他完成这道作业题。

输入

第一行一个整数\(n\),表示给定的\(n\)

输出

一行一个浮点数表示答案,保留\(4\)位小数。

样例

样例输入

#样例1
0
#样例2
2

样例输出

#样例1
0.6321
#样例2
0.2642

数据范围

对于\(10\%\)的数据\(n<=10\)
对于\(100\%\)的数据满足\(n<=10000\)

题解

真·数学题。

解法\(1\)
\(10\)个暴算,\(11-50\)二分答案用\(f_{n-1}=\frac{1-f_n}{n}\)验证。更大的算近似值\(f_n\approx\frac{1}{n+2}\)

解法\(2\)
\(Orz\),跪膜\(Freopen\)大爷。
\(\frac{1}{e}\)泰勒展开变成\(\sum(-1)^n\cdot \frac{1}{n!}\)
\(f_n\)变成非递推形式,这一步很好想:
\[f_n=\sum_{i=0}^{n}(-1)^{n-i}\cdot\frac{n!}{i!}-(-1)^n\cdot n!\cdot\frac{1}{e}\]
\(\frac{1}{e}\)带入进去,注意\(\frac{1}{e}\)展开后是有无穷项的。
\[f_n=\sum_{i=0}^{n}(-1)^{n-i}\cdot\frac{n!}{i!}-\sum_{i=0}(-1)^{n+i}\cdot \frac{n!}{i!}\]
因为\(n-i\)\(n+i\)的奇偶性是相同的,我们可以前后抵消一大坨
\[f_n=\sum_{i=n+1}(-1)^{n+i}\cdot\frac{n!}{i!}=\sum_{i=1}(-1)^{i}\cdot\frac{n!}{(n+i)!}\]
发现\(\frac{n!}{(n+i)!}\)必定小于\(1\),而且是在做除法,精度不会流失,那么我们就可以枚举\(i\),直到某一项小于\(eps\)之后就停止,由于是以阶乘的速度减小,所以只需要枚举几项就可以了。

代码采取的是第二种方法。

\(Code:\)

#include 
#include 
#include 
#include 
using namespace std;
#define eps 1e-6
int n;
double ans, now;
int main()
{
    scanf("%d", &n);
    now = 1;
    for (int i = 1; now >= eps; i++)
    {
        now = now / (n + i);
        if (i & 1)
            ans += now;
        else
            ans -= now;
    }
    printf("%.4f\n", ans);
}

你可能感兴趣的:(「模拟赛20190329」作业 泰勒展开)