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

    欧拉数学习笔记

    定义

    定义(left<egin{matrix}n\iend{matrix} ight>)为长度为(n)的排列(p),满足(p_j<p_{j+1})的数目为(i)的排列数,也就是欧拉数。

    求法

    首先可以考虑dp转移(left<egin{matrix}n\iend{matrix} ight>),考虑现在有(1sim n-1),加入(n)

    • 如果(n)加在排列最左边,数目不变,由(left<egin{matrix}{n-1}\iend{matrix} ight>)转移
    • 如果(n)加在排列最左边,数目增加,由(left<egin{matrix}{n-1}\{i-1}end{matrix} ight>)转移
    • 插在某个(p_j<p_{j+1})中间,数目不变,由(left<egin{matrix}{n-1}\{i}end{matrix} ight> imes i)转移
    • 插在某个(p_j>p_{j+1})中间,数目增加,由(left<egin{matrix}{n-1}\{i-1}end{matrix} ight> imes (n-1-i))转移

    总转移方程:

    [left<egin{matrix}n\iend{matrix} ight>=(i+1)left<egin{matrix}n-1\iend{matrix} ight>+(n-i)left<egin{matrix}n-1\i-1end{matrix} ight> ]


    但是有些出题人就说了:我计数题都出(1e5),你这么递推,我很不满意!

    下面给出容斥求法:
    (egin{vmatrix}n\kend{vmatrix})表示长度为(n)的排列,至少有(k)(p_j<p_{j+1})的方案数。
    二项式反演:

    [egin{vmatrix}n\kend{vmatrix}=sumlimits_{i=k}^ndbinom ikleft<egin{matrix}n\iend{matrix} ight>\ left<egin{matrix}n\kend{matrix} ight>=sumlimits_{i=k}^n(-1)^{i-k}dbinom ikegin{vmatrix}n\iend{vmatrix} ]

    考虑求(egin{vmatrix}n\kend{vmatrix}),将小于号连成的两个位置看成一个连通块,那么一共就有(n-k)个连通块,那么联通块内部排列只有一种,因为每个连通块不能为空,所以一个连通块的 EGF 就是(e^x-1),因为是「至少」,所以两个连通块之间可以随意合并,那么(egin{vmatrix}n\kend{vmatrix}=n![x^n](e^x-1)^{n-k})
    把上式用二项式定理拆开:

    [egin{aligned} n![x^n](e^x-1)^{n-k}&=n![x^n]sum_{i=0}^{n-k}{n-kchoose i}e^{ix}(-1)^{n-k-i}\ &=sum_{i=0}^{n-k}{n-kchoose i} i^n (-1)^{n-k-i}\ &=(n-k)! sum_{i=0}^{n-k}frac {i^n}{i!}frac{(-1)^{n-k-i}}{(n-k-i)!} end{aligned} ]

    卷一下就可以求出每个(egin{vmatrix}n\kend{vmatrix})了。

    最后我们再 NTT 加速反演就可以求出(left<egin{matrix}n\kend{matrix} ight>)了,总复杂度(O(nlog n))


    但是发现上面的做法还是naive了,发现可以不用卷两遍。
    (egin{vmatrix}n\kend{vmatrix}=sum_{i=0}^{n-k}{n-kchoose i} i^n (-1)^{n-k-i})直接代回(left<egin{matrix}n\kend{matrix} ight>=sumlimits_{i=k}^n(-1)^{i-k}dbinom ikegin{vmatrix}n\iend{vmatrix}),那么有

    [egin{aligned} left<egin{matrix}n\kend{matrix} ight>&=sumlimits_{i=k}^n(-1)^{i-k}dbinom ikegin{vmatrix}n\iend{vmatrix}\ &=sum_{i=k}^n(-1)^{i-k}{ichoose k}sum_{j=0}^{n-i}{n-ichoose j}j^n(-1)^{n-i-j}\ &=sum_{i=k}^n{ichoose k}sum_{j=0}^{n-i}{n-ichoose j}j^n(-1)^{n-k-j}\ &=sum_{j=0}^{n-k}sum_{i=n-j}^n{ichoose k}{n-ichoose j}j^n(-1)^{n-k-j}\ &=sum_{j=0}^{n-k}(-1)^{n-k-j}j^nsum_{i=0}^n{ichoose k}{n-ichoose j} end{aligned} ]

    考虑后面(sum_{i=0}^n{ichoose k}{n-ichoose j})怎么求。

    [{ichoose k}=[x^{i-k}]frac {1}{(1-x)^{k+1}},{n-ichoose j}=[x^{n-i-j}]frac {1}{(1-x)^{j+1}}\ Rightarrow sum_{i=0}^n{ichoose k}{n-ichoose j}=[x^{n-j-k}]frac 1{(1-x)^{k+j+2}}={n+1choose k+j+1} ]

    然后可以(O(n))算出一个(left<egin{matrix}n\kend{matrix} ight>)了(一行减法卷积(O(nlog n)))。


    还有一个高妙的组合意义

    这里有个模板题

    应用

    CF1349F1 Slime and Sequences (Easy Version)

    直接求好序列十分头疼,所以我们建立长度为(n)的好序列与长度为(n)的排列之间的关联。
    对于一个排列(p),中的某个(p_i),如果(jin[1,i))中有(k)(p_{j}<p_{j+1}),那么(a_{p_i}=k+1)
    这样构造的(p)(a)一一对应,下面简要证明:
    首先(a)中的(1)肯定放在最前面,且对于(p)中极长的前缀(p_{1...k})满足(p_{i}>p_{i+1},iin[1,k))(a_{p_{1...k}}=1),如果我们要填(2)的话一定会使得有一个(1)(2)前面,(2,3)的情况同理。
    感性理解一下就好了

    对于(ans_k)考虑每个位置(i)的贡献,那么有

    [ans_k=sumleft<egin{matrix}n\k-1end{matrix} ight>{nchoose i}(n-i)! ]

    因为不会拉格朗日反演,所以 F2 鸽了。

  • 相关阅读:
    2020 CCPC Wannafly Winter Camp Day2 K题 破忒头的匿名信(AC自动机+dp)
    CF1446C Xor Tree(01Trie)
    day04---系统重要文件
    day03--vi和vim快捷方式及操作系统目录介绍
    day02---虚拟机上网模式
    day01---操作系统安装环境准备
    django中一些快捷函数
    django中的一些装饰器用法
    auth模块的一些方法
    celery中异步延迟执行任务apply_anysc的用法
  • 原文地址:https://www.cnblogs.com/heyujun/p/13895275.html
Copyright © 2011-2022 走看看