闲话 23.1.26

闲话

下午补。

今日推歌:FREELY TOMORROW - Mitchie M feat. 初音ミク
有兴趣的可以自己了解。

今日模拟赛 T3

小恶心。原题似乎是 pe444,但是好像不让写题解的样子?
反正不是原题啦,随便!

首先观察 E(111)=5.2912 这个数值就很不对劲。扔进计算器发现 H(111)=5.291243607252986。这里的 H 就是调和级数,常这么记。
然后猜了这个结论,也就是 S0(n)=H(n)

具体是咋证的呢?
我们假设现在翻开的牌上数的集合是 A,它的补是 B。有一个结论是如果 maxA>minB 就和前面的最大值换,反之就不换。
比较显然?因为你可以选择的一定是 maxA,选了一定是不劣的。这点也是需要自己看不见自己的牌才能决定的。
然后发现只有自己是后缀最大值时才会不换。假设当前的排列是 p,我们设 suff(i)in 的最大值,我们要的就是 [pi=suff(i)] 的期望。
这个东西就是 H(n)

看到前缀和就想到用生成函数来刻画。假设 H(n) 的生成函数是 F(x),我们考虑表出 F(x)
H(n) 的差分是 1n,而这个东西是好表示的,就是 ln(1x),证明考虑对 (1x)1 做积分。场上以为是 x((1-x)^{-1})' 所以推了老半天错解
于是 F(x)=ln(1x)(1x)Sk(n) 的生成函数 Fk(x) 也好写出了,就是

ln(1x)(1x)k+1

我们想要得到递推,考虑分析 ode。

Fk(x)=(ln(1x)(1x)k+1)=(ln(1x))(1x)k+1(k+1)(1x)kln(1x)(1x)2(k+1)=(k+1)ln(1x)(1x)k+2+1(1x)k+2=(k+1)Fk+1(x)+1(1x)k+2

我们容易提取上面的式子两边的系数,也就是

(n+1)Sk(n+1)=(k+1)Sk+1(n)+(k+1+nn)

我们希望对 k 作递推,化简得到

Sk(n)=n+1kSk1(n+1)1k(k+nn)

到这里我们就可以快速地递归到 S0(n) 后计算了,组合数可以 O(k) 地求得。

那我们如何得到 S0(n) 呢?
n 较小时可以预处理 H(n)n 较大时呢?可以发现答案对精度的要求并不高。因此我们容易想到

H(n)=lnn+γ+ϵn

其中 ϵn=O(1n)γ 是 Euler-Mascheroni 常数,约为 0.57721566490153286060651209。背不过也可以直接算一个出来,几秒钟就能得到小数点后 ⑨ 位精度!

code
#include <bits/stdc++.h>
using namespace std; 
using pii = pair<int,int>; using vi = vector<int>; using vp = vector<pii>; using ll = long long; 
using ull = unsigned long long; using db = double; using ld = long double; using lll = __int128_t;
template<typename T1, typename T2> T1 max(T1 a, T2 b) { return a > b ? a : b; }
template<typename T1, typename T2> T1 min(T1 a, T2 b) { return a < b ? a : b; }
#define multi int T; cin >> T; while ( T -- )
#define timer cerr << 1. * clock() / CLOCKS_PER_SEC << '\n';
#define iot ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#define file(x) freopen(#x".in", "r", stdin), freopen(#x".out", "w", stdout)
#define rep(i,s,t) for (register int i = (s), i##_ = (t) + 1; i < i##_; ++ i)
#define pre(i,s,t) for (register int i = (s), i##_ = (t) - 1; i > i##_; -- i)
#define eb emplace_back
#define pb pop_back
const int N = 1e6 + 10;
const int inf = 0x3f3f3f3f;
const ll infll = 0x3f3f3f3f3f3f3f3fll;
#define gamma 0.57721566490153286060651209
#define H(n) (__builtin_logl(n) + gamma)
ll k, n;
ld h[1000003];

ld S(int k, ll n) {
    if (k == 0 and n <= 1e6) return h[n];
    if (k == 0 and n > 1e6) return H(n);
    ld ret = 1. / k;
    rep(i,1,k) ret = ret / i * (n + i);
    return S(k - 1, n + 1) / k * (n + 1) - ret;
}

signed main() {
	iot; cout.unsetf(ios::fixed); cout.setf(ios::scientific); cout.precision(9);
    cin >> k >> n;
    rep(i,1,min(1e6, n + k + 1)) h[i] = h[i - 1] + (ld)1. / i;
    cout << S(k, n) << '\n';
} 



一个小级数

闲的没事看 b 站,然后看到一个视频
没看 up 主的讲解,自己搞了一会儿出来了,发现挺好玩的,写写。

我们想要的就是证明

i1(2ii1)xi+1(1x)i1=12x1

考虑从左往右证。首先这个 i 的范围挺难受的,不如从 0 开始,也就是

i0(2i+2i)xi+2(1x)i

提出来 x2,再合并一下同类项得到

x2i0(2i+2i)(xx2)i

用原丁真,鉴定为可以直接套广义二项级数

根据 定理 附 3.1.3,我们可以写出后面的封闭形式,也就是

x2B2(xx2)212+2B2(xx2)1

众所周知,B2(z) 是卡特兰数的生成函数,也就是 114z2z。带入 z=xx2 可以得到化简的答案即为 22p2p(1p)=1p
你说根号咋确定正负?还是考察是否合理。

带回原式,就是

x2x212+2x=12x1

结束啦!

posted @   joke3579  阅读(117)  评论(4编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示