【XSY2962】作业 数学

题目描述

  有一个递推式:

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

  求 (f_n)

  (nleq 10000)

题解

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

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

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

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

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

[egin{align} f_n&=n!sum_{i=0}^nfrac{{(-1)}^{n-i}}{i!}-n!{(-1)}^nfrac{1}{e}\ &=n!sum_{i=0}^nfrac{{(-1)}^{n-i}}{i!}-n!{(-1)}^nsum_{igeq 0}frac{{(-1)}^i}{i!}\ &=n!{(-1)}^nsum_{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
",ans);
	return 0;
}