【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;
}