【XSY2962】作业 数学

题目描述

  有一个递推式:

\[\begin{align} f_0&=1-\frac{1}{e}\\ f_n&=1-nf_{i-1} \end{align} \]

  求 \(f_n\)

  \(n\leq 10000\)

题解

  如果直接按照式子推的话会爆精度,因为误差是阶乘级别放大的。

  但是我们可以逆过来递推。

\[\begin{align} f_\infty&=0\\ f_{n-1}&=\frac{1-f_n}{n} \end{align} \]

  这样误差就是不断缩小的。

  或者你直接推式子也是可以的。

\[\begin{align} f_n&=n!\sum_{i=0}^n\frac{{(-1)}^{n-i}}{i!}-n!{(-1)}^n\frac{1}{e}\\ &=n!\sum_{i=0}^n\frac{{(-1)}^{n-i}}{i!}-n!{(-1)}^n\sum_{i\geq 0}\frac{{(-1)}^i}{i!}\\ &=n!{(-1)}^n\sum_{i>n}\frac{{(-1)}^i}{i!}\\ \end{align} \]

  然后算个一万项就行了。

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int n;
int main()
{
	scanf("%d",&n);
	double ans=0,s=1;
	for(int i=n+1;i<=20000;i++)
	{
		s/=i;
		ans-=(i&1?-1:1)*s;
	}
	ans*=(n&1?-1:1);
	printf("%.4lf\n",ans);
	return 0;
}
posted @ 2018-05-28 14:53  ywwyww  阅读(275)  评论(0编辑  收藏  举报