题目描述
有一个递推式:
\[ \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;
}