作业 - 结论题

本文探讨了一种特定的递归数列求解方法,通过将数列转换为特定形式并利用极限理论,实现了高精度求解。文章详细介绍了从数列公式出发,逐步推导出简化形式的过程,最终通过逆向计算得到了精确结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:
已知:f0=1−1e,fn=1−nfn−1f_0=1-\frac1e,f_n=1-nf_{n-1}f0=1e1,fn=1nfn1
fn,n≤104f_n,n\le10^4fn,n104精度要求10−410^{-4}104
题解:
注意到fnf_nfn可以写成an−bne−1a_n-b_ne^{-1}anbne1的形式,a0=1,b0=1a_0=1,b_0=1a0=1,b0=1
经过一些推导化简可以显然得知:
bn=(−n)bn−1=(−1)nn!an=∑i=0nn!(n−i)!(−1)i=n!(−1)n∑i=0n(−1)ii!b_n=(-n)b_{n-1}=(-1)^nn!\\ a_n=\sum_{i=0}^n\frac{n!}{(n-i)!}(-1)^i=n!(-1)^n\sum_{i=0}^n\frac{(-1)^i}{i!} bn=(n)bn1=(1)nn!an=i=0n(ni)!n!(1)i=n!(1)ni=0ni!(1)i
显然limitn→+inf⁡∑i=0n(−1)ii!=e−1\mathrm{limit}_{n\rightarrow+\inf}\sum_{i=0}^n\frac{(-1)^i}{i!}=e^{-1}limitn+infi=0ni!(1)i=e1
limitn→+inf⁡fn=n!(−1)ne−1−n!(−1)ne−1=0\mathrm{limit}_{n\rightarrow+\inf}f_n=n!(-1)^ne^{-1}-n!(-1)^ne^{-1}=0limitn+inffn=n!(1)ne1n!(1)ne1=0
(顺带由刚刚的推导可以看出误差大约在O(1n)O\left(\frac1n\right)O(n1)左右的样子)
因此设fN=0f_{N}=0fN=0,并取N≥105N\ge10^5N105,然后反着推回来即可。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define Rep(i,v) rep(i,0,(int)v.size()-1)
#define lint long long
#define ull unsigned lint
#define db long double
#define pb push_back
#define mp make_pair
#define fir first
#define sec second
#define gc getchar()
#define debug(x) cerr<<#x<<"="<<x
#define sp <<" "
#define ln <<endl
using namespace std;
typedef pair<int,int> pii;
typedef set<int>::iterator sit;
inline int inn()
{
    int x,ch;while((ch=gc)<'0'||ch>'9');
    x=ch^'0';while((ch=gc)>='0'&&ch<='9')
        x=(x<<1)+(x<<3)+(ch^'0');return x;
}
const int N=500010;
db f[N];
int main()
{
    int n=inn();f[N-1]=0;
    for(int i=N-2;i>=0;i--)
        f[i]=(1-f[i+1])/(i+1);
    printf("%.4f\n",double(f[n]));
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值