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