调和级数

调和级数

调和级数:

k=11k

该无穷级数发散。

性质

k=1n1klogn

证明

k=1n1k=1+12+13+···+1n

=(1)+(12+13)+(14+15+16+17)+···+1n

1+1+1+···+1(logn1)

=logn.

即将 n 个数拆成 O(logn) 个小区间,每个区间的和趋近为 1

证毕。

更优秀的估算方法:

k=1n1klnn+γ+12n

其中 γ 为欧拉常数,约等于 0.577215664901532860606512090082402431042159335

n 时,12n 趋近于 0。可忽略。

n 较小时可以暴力 O(n) 求调和级数值。

较大时就可以用估算法输出 lnn+γ

例题 1:洛谷p5147 随机数生成器

Ei 表示函数 work 自变量为 i 时返回值的期望。

那么有:

En={0n=11+1nk=1nEkn>1

考虑 n>1 时的情况。

En=1+1nk=1nEk(1)=>n×EnEnn=k=1n1Ek

换元 n+1n

(2)n×En+1Enn1=k=1n1Ek

联立 1 式与 2 式。

En+1En=1n

显然,等式左边是一个差分的形式,而右边是一个分子为 1 的分数。

写出几项就可以发现,En 实际上等于 i=1n11i

求调和级数即可。

#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define FOR(i,l,r) for(int i=l;i<=r;++i)
#define ROF(i,r,l) for(int i=r;i>=l;--i)
#define mkp make_pair
#define fr first
#define se second
using namespace std;
const double gama=0.5772156649;
int n;double ans=0;
int main() {
	cin>>n;
	if(n<=10000000) FOR(i,1,n-1) ans+=1.0/i;
	else ans=log(n)+gama;
	if(n==1) ans=-1;
	printf("%.5lf\n",ans+1);
	return 0;
}
posted @   cannotmath  阅读(87)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示