zoukankan      html  css  js  c++  java
  • 「学习笔记」欧拉数

    定义

    记一个排列 (P) 的升高为 (k) 当且仅当存在 (k) 个位置 (i) 使得 (P_i<P_{i+1})

    那么定义欧拉数 (leftlangleegin{matrix}n\kend{matrix} ight angle) 表示长度为 (n) 且有 (k) 个上升的排列的数量。

    递推式

    通过讨论 (n) 在最左边,最右边还是中间可以得出转移:

    [leftlangleegin{matrix}n\kend{matrix} ight angle = (k + 1)leftlangleegin{matrix}n - 1\kend{matrix} ight angle + (n - k) leftlangleegin{matrix}n - 1\k - 1end{matrix} ight angle ]

    计算

    高妙的组合意义

    考虑计算 (leftlangleegin{matrix}n\kend{matrix} ight angle / n!) 也就是概率,可以发现,对于 (n) 个实数的均匀分布 ((a_1, a_2, cdots, a_n) in (0, 1)^n) 产生和排列 (P) 相同的偏序关系的概率是 (frac 1{n!}),这样我们就可以将问题转化为 (a_i < a_{i + 1})(k) 个的概率。

    (a) 进行差分,定义 (a_0 = 0, b_i = (a_i - a_{i - 1}) mod 1),显然 (b_i in (0, 1))

    考虑 (b_i) 的实际意义,发现当 (a_{i - 1} < a_i) 时,(b_i = a_i - a_{i - 1}),否则 (b_i = 1 + a_i - a_{i - 1}),而 (a_{i - 1} < a_{i})(k + 1) 个((a_0 = 0)),所以说 (sum b_i = n - k - 1 + a_n in (n - k - 1, n - k))。这样,问题就变为了给定 (n)((0, 1)) 之间的实数 (x_1, x_2, cdots, x_n),求满足 (sum x_i in (n - k - 1, n - k)) 的概率,可以转化为 (sum x_i < n - k) 的概率然后差分,设其为 (F(n - k))

    使用几何概型,由于样本空间的“体积”是 (1),所以答案就是满足条件的区域的“体积”。

    (G(k)) 表示 (n) 个随机变量没有限制的情况下的满足 (sum x_i < k) 的区域的“体积”。

    考虑容斥有多少个 (x_i > 1),能够列出式子:

    [F(k) = sum_{i = 0}^k (-1)^i inom ni G(k - i) ]

    接下来只需要知道如何计算 (G(k)) 即可。

    (n) 个变量做前缀和,设为 (t_i),那么只需要满足 (t_i < t_{i + 1})(t_n < k) 的条件即可,由最开始的性质,可以将其对应到排列上得出概率为 (frac 1 {n!})。又因为 (G(k)) 是“体积”,所以 (G(k) = frac {k^n}{n!}),即:

    [F(k) = frac 1 {n!} sum_{i=0}^k (-1)^i inom ni (k - i)^n ]

    于是 (leftlangleegin{matrix}n\kend{matrix} ight angle) 可以做到计算一个 (mathcal O(n)),计算一行 (mathcal O(n log n))

    直接容斥

    广告

    (F(n, k)) 表示长度为 (n) 的排列,钦定有 (k)< 的方案数。

    考虑将 < 看成边,那么排列中将会形成 (n - k) 个连通块,而连通块内部必须有序,连通块之间可以任意打乱顺序,所以方案数就是 ((n - k)!egin{Bmatrix} n\n - k end{Bmatrix})

    由二项式反演:

    [egin{aligned} leftlangleegin{matrix}n\kend{matrix} ight angle &= sum_{i = k}^n (-1)^{i - k} inom ik (n - i)!egin{Bmatrix} n\n - i end{Bmatrix}\ &=sum_{i = k}^n (-1)^{i - k} inom ik sum_{j = 0}^{n - i} inom{n - i} j (-1)^{n - i - j} j^n\ &=sum_{j = 0}^{n - k} j^n (-1)^{n - k - j} sum_{i} inom ik inom {n - i}j\ &= sum_{j = 0}^{n - k} (-1)^{n - k - j} j^n inom {n + 1} {k + j + 1} end{aligned} ]

    解释一下最后一步吧,由于 (inom ik = [x^{i - k}] frac 1{(1 - x)^{k + 1}}, inom {n - i}j = [x^{n - i - j}] frac 1{(1 - x)^{j + 1}}),所以 (sum_i inom ik inom {n - i}j = [x^{n - j - k}] frac 1 {(1 - x)^{k + j + 2}} = inom {n + 1}{k + j + 1})

    同样可以直接卷积求出一行欧拉数。

  • 相关阅读:
    C# 实现类库并调用
    C# pictureBox.Image获得图片的三种方法
    C# 指针使用总结
    C++ 怎样让函数返回数组
    C# 枚举与位枚举(Enum)
    Labview调用C#动态链接库dll
    C# partial 作用
    C# Internal关键字小结
    C# => 运算符
    C# 中 ??、 ?、 ?: 、?.、?[ ]
  • 原文地址:https://www.cnblogs.com/cj-xxz/p/13895580.html
Copyright © 2011-2022 走看看