为什么这东西叫欧拉数呢?因为这是欧拉提出的。
这玩意到底是什么?
对于一个排列
π 来说,我们记这个排列的升高为满足
πi<πi+1 的
i 的个数,形式化的说,也就是这个式子:
i=1∑n−1[πi<πi+1]
我们便自然想对有长度为
n 且有
k 个升高的排列计数。这个时候就可以定义欧拉数
⟨nk⟩ 为长度为
n 并且恰有
k 个升高的排列个数。
比如说
{1,2,3,4} 有
11 个排列恰有两个上升:
1324,1423,2314,2413,34121243,1342,2341,2134,3124,4123
其中第一行列出了满足
π1<π2>π3<π4 的排列,第二行列出了满足
π1<π2<π3>π4 和
π1>π2<π3<π4 的排列。所以
⟨42⟩=11。
这玩意到底怎么求?
这部分是这篇文章的重中之重。在讲解如何求这东西之前,这里先给出一些表:
(蒯的《混凝土数学》的,主要是方便大家如果看到什么
1 11 11 1 这样的东西就可以直接猜)
首先考虑如何
O(n2) 求,这里有一道模板题:
P2401
一个最朴素的方法是 DP 求解。考虑将
n 插入
1,⋯,n−1 的排列中,需要讨论四种情况:
-
在排列的左端插入一个
n,这样不产生任何升高,所以这种情况从
⟨n−1k⟩ 转移来。
-
在排列的右端插入一个
n,这样会产生一个升高,所以这种情况由
⟨n−1k−1⟩ 转移来。
-
在某一个位置
i 和
i+1 中间插入
n,其中
πi<πi+1,那么这里会产生一个升高,同时会破坏原来的一个升高,所以总的升高是不变的。所以之前的排列要有
k 个升高,所以,这种情况由
k⟨n−1k⟩ 转移来。
-
在某一个位置
i 和
i+1 中间插入
n,其中
πi>πi+1,那么这里会产生一个升高,但是不会破坏任何原有的升高,所以总而言之产生了一个升高。所以之前的排列要有
k−1 个升高,所以,这种情况由
(n−k−1)⟨n−1k−1⟩转移来。
将这四种情况加起来得到第一个求欧拉数的式子:
⟨nk⟩=(k+1)⟨n−1k⟩+(n−k)⟨n−1k−1⟩
这样就可以
O(n2) DP 了。
在看另一个题目之前,可以先观察几个关于欧拉数的简单恒等式。第一个是关于对称性的:
⟨nk⟩=⟨nn−k−1⟩
这个式子很明显,考虑将长度为
n 的排列反过来,原来的一个升高现在变成一个下降,原来的一个下降现在变成一个升高。如果原来的排列中有
k 个升高,那么现在的排列中就会有
n−1−k 个。同时因为这个排列到排列的映射显然是双射(也就是一一对应),所以这个恒等式就成立了。
接下来的几个是关于一些特殊值,这些特殊值将会给我们的一些进阶公式做铺垫:
⟨n0⟩=⟨nn−1⟩=1,⟨n1⟩=⟨nn−2⟩=2n−n−1
首先来看左边那个。唯一满足存在
n 个上升的排列为
{1,2,⋯,n},所以这个欧拉数为
1。
对于右边那个,枚举一下唯一一个放大于号位置的两边到底有多少个升高,再看看左边摆哪些数。这个时候,整个排列就确定下来了。但是因为要容斥掉左边为
1,2,⋯,k 右边为
k+1,k+2,⋯,n 的不合法排列我们有
⟨nn−2⟩=i=1∑n−1(in)−(n−1)
注意到,这个东西是很显然的二项式定理,所以
⟨nn−2⟩=i=0∑n(in)−(0n)−(nn)−(n−1)=2n−n−1
接下来就有更炫酷的操作了:
⟨n2⟩=3n−(n+1)2n+(2n+1)
⟨n3⟩=4n−(n+1)3n+(2n+1)2n−(3n+1)
看出来什么吗?好像有一个规律呢,这就是我们的进阶公式:
⟨nm⟩=k=0∑m(kn+1)(m+1−k)n(−1)k
接下来看另一道题:
LOJ 2834(不瞒我说,这题能出
n≤5×106),在这个题目中,将会阐述如何证明上述公式。
考虑数学归纳法,由
n2 DP 我们得到
⟨nm⟩=(m+1)⟨n−1m⟩+(n−m)⟨n−1m−1⟩
考虑直接推右边,然后套进来,大概是这样子:
(m+1)k=0∑m(kn)(m+1−k)n−1(−1)k+(n−m)k=0∑m−1(kn)(m−k)n−1(−1)k
然后再套进来:
k=0∑m(kn)[(m+1)(m+1−k)n−1(−1)k+(n−m)(m−k)n−1(−1)k]
凑一下形式:
k=0∑m(kn)[(m+1−k)n(−1)k+k(m+1−k)n−1(−1)k+(n−m)(m−k)n−1(−1)k]
还是凑形式:
k=0∑m(kn)[(m+1−k)n(−1)k+m+1−kk(m+1−k)n(−1)k+(n−m)(m−k)n−1(−1)k]
这里有个 key observation,注意到
(k−1n)=n+1−kk(kn),所以可以再凑形式:
k=0∑m((kn)+(k−1n))(m+1−k)n(−1)k−k=0∑m(kn)(n+1−kk−m+1−kk)(m+1−k)n(−1)k+k=0∑m(kn)(n−m)(m−k)n−1(−1)k
第一个和式中的两个二项式之和很 trivial,然后后面的和式可以通分:
k=0∑m(kn+1)(m+1−k)n(−1)k−k=0∑m(kn)((n+1−k)(m+1−k)(m−n)k)(m+1−k)n(−1)k+k=0∑m(kn)(n−m)(m−k)n−1(−1)k
然后第二个和式可以消掉一些东西:
k=0∑m(kn+1)(m+1−k)n(−1)k−k=0∑m(m−n)(n+1−k)k(kn)(m+1−k)n−1(−1)k+k=0∑m(kn)(n−m)(m−k)n−1(−1)k
对第三个和式进行代换,并且调整上下参数,第二个和式反过来用之前提到的恒等式:
k=0∑m(kn+1)(m+1−k)n(−1)k−(k=0∑m(m−n)(k−1n)(m+1−k)n−1(−1)k+k=0∑m(k−1n)(n−m)(m+1−k)n−1(−1)k)
⟨nm⟩=k=0∑m(kn+1)(m+1−k)n(−1)k
边界条件很简单,所以数学归纳法成立。啊,我们终于完成了这个艰巨的任务。
如果使用快速幂的话可以做到
O(nlogn) 的复杂度。但是由于指数给出,同时因为幂函数是积性函数,所以可以线性筛。这个时候因为只需要对质数的取值计算幂,时间复杂度降至
O(n)。
Tips:在本题的官方题解中,讲述了欧拉数到值域为
(0,1] 序列上的一个映射,也即如下问题:
x1,⋯xn 为一个长度为
n 的实数序列,且
0<xi≤1。求
k−1≤∑xi<k 的概率。
这个的概率其实就是
n!1⟨nk⟩,具体证明可以参见
EI 的题解。
这玩意能不能求一行?
接下来将会用两种方法求一行,顺便介绍一些有名的恒等式。
首先利用上式我们可以构造序列
g,h 满足:
gk=(kn+1)(−1)k,hk=(k+1)n
这个时候两个东西卷一卷就得了。
但是我们不主要介绍这个,反而介绍一个非常重要的恒等式,也即 Worpitzky 恒等式:
xn=k∑⟨nk⟩(nx+k)
在直接证明这个东西之前,我们考虑热热身,证明如下恒等式:
x(nx+k)=(k+1)(n+1x+k)+(n−k)(n+1x+k+1)
直接暴力拆二项式系数:
n!(x+k−n)!x(x+k)!=(n+1)!(x+k−n−1)!(k+1)(x+k)!+(n+1)!(x+k−n)!(n−k)(x+k+1)!
右边两个东西凑凑形式
n!(x+k−n)!x(x+k)!=(n+1)!(x+k−n)!
然后是简单的去括号:
n!(x+k−n)!x(x+k)!=(n+1)!(x+k−n)!(n+1)x(x+k)!
这东西显然成立。
首先从一个很容易的东西开始:
xn+1=x⋅xn=k=0∑n⟨nk⟩x(nx+k)
然后我们热身的东西就可以派上用场:
xn+1=k=0∑n⟨nk⟩((k+1)(n+1x+k)+(n−k)(n+1x+k+1))
拆括号:
xn+1=k=0∑n⟨nk⟩(k+1)(n+1x+k)+k=0∑n⟨nk⟩(n−k)(n+1x+k+1)
看看右边,我们用之前的递推式,有
k=0∑n+1⟨n+1k⟩(n+1x+k)=k=0∑n+1((k+1)⟨nk⟩+(n+1−k)⟨nk−1⟩)(n+1x+k)
注意到在
k=n+1 处被求和式值为
0,所以适当调整一下上界,并拆括号
k=0∑n+1⟨n+1k⟩(n+1x+k)=k=0∑n(k+1)⟨nk⟩(n+1x+k)+k=0∑n(n+1−k)⟨nk−1⟩(n+1x+k)
右边的和式简单代换一下,得到
k=0∑n+1⟨n+1k⟩(n+1x+k)=k=0∑n(k+1)⟨nk⟩(n+1x+k)+k=−1∑n−1(n−k)⟨nk⟩(n+1x+k+1)
然后发现这个
k=−1 和
k=n 时右边和式中被求和式值为
0,调整一下上下界即可证明该恒等式。
接下来的内容可能需要一些生成函数和有限微积分的基础知识,如果不太会的可以先跳过。
首先我们注意到
Δ((nx+k))=(n−1x+k)
然后做多次差分即可得到这样一个东西:
Δm((nx+k))=(n−mx+k)
很好,我们可以前进一步了
k∑⟨nk⟩(n−mx+k)=Δm(xn)=j∑(jm)(−1)m−j(x+j)n
我们将
x=0 代入,并使用一个非常常见的公式
m!{nm}=k∑(km)kn(−1)m−k
于是有
k∑⟨nk⟩(n−mk)=m!{nm}
这里有一个 key observation。我们两边对
m 求和,有
m∑k∑⟨nk⟩(n−mk)=m∑m!{nm}
乘上
zn−m(换一个变量)
k∑⟨nk⟩m∑zn−m(n−mk)=m∑zn−mm!{nm}
发现这是个二项式定理,然后简单的代换一下最终我们得到
⟨nk⟩=k∑{nk}(mn−k)(−1)n−k−mk!
强行拆组合数
⟨nm⟩=k∑{nk}m!(n−k−m)!(n−k)!(−1)n−k−mk!
写得更加清楚一点:
m!⟨nm⟩=k∑({nk}k!(n−k)!)(n−(m+k))!(−1)n−(m+k)
现在,设
fi=i!⟨ni⟩,
gk={nk}k!(n−k)!,
hk=(n−k)!(−1)n−k,然后有
fi=k∑gkhi+k
于是就很平凡了。
这玩意能不能求一列?
感觉目前没有 practical 的做法吧,就把我现在所知道的一些求法说一下。
下面的问题没有说模数的话模数默认
998244353。
首先来看一个问题:
给定
m,
q 次询问,每次给出一个
n,求
⟨nm⟩,其中
1≤m≤20,1≤q≤105。
⟨nm⟩=k=0∑m(kn+1)(m+1−k)n(−1)k
因为
(m+1−k) 取值最多
21 种,所以可以考虑分块打表,然后预处理阶乘即可做到
O(qm) 的复杂度。
接下来是另一个恒等式:(From
P6073 Subtask 2)
⟨nm⟩=k=0∑nkn(−1)n−k−m(k+m+1n+1)
这个恒等式与上面那个恒等式长得差不多,但是实际上是完全不一样的两个恒等式。
证明这个恒等式的过程中,一开始就出现了一个 key observation,也就是利用范德蒙德卷积拆右侧的二项式:
(k+m+1n+1)=j=0∑n(kj)(mn−j)
如果实在记不得这个范德蒙德卷积公式的话,这里有一个生成函数的方法:
考虑在右边乘上一个
xn 并且把它拆成
xj 与
xn−j 的乘积,于是等式右边变成如下式子:
j=0∑nxj(kj)xn−j(mn−j)
然后你会发现我们如果设
F(x)=i=0∑∞(ki)xi 和
G(x)=i=0∑∞(mi)xi,那么等式右边就是两个生成函数的乘积的
xn 的系数。
幸运的是,这两个生成函数都有简单的封闭形式,这里以
F(x) 为例。(其实
F(x) 和
G(x) 形式是一样的,知道一个就知道另一个)
考虑到当
i<k 的时候
xi 的系数为
0,所以我们可以考虑平移一下。
我们构造
F′(x)=i=0∑∞(ki+k)xi,那么可以发现
F(x)=xkF′(x)。
然而
F′(x) 的封闭形式非常简单,是
(1−x)k+11。
所以,
F(x)=(1−x)k+1xk,同理有
G(x)=(1−x)m+1xm,于是得到
F(x)G(x)=(1−x)k+m+2xk+m。
根据上面的推导,我们发现
(1−x)k+m+1xk+m 中
xn 的系数很好求,而我们发现
(1−x)k+m+2xk+m=(1−x)k+m+1xk+m1−x1
而这个
1−x1 相当于将系数做前缀和。所以我们的答案为
i=0∑n(k+mi)
这就是个裸的上指标求和,因此答案为
(k+m+1n+1)。
于是可以直接代入
⟨nm⟩=k=0∑nkn(−1)n−k−mj=0∑n(kj)(mn−j)
调整一下求和的上下界
⟨nm⟩=k=0∑nj=k∑nkn(−1)n−k−m(kj)(mn−j)
交换一下求和顺序
⟨nm⟩=j=0∑nk=0∑jkn(−1)n−k−m(kj)(mn−j)
接下来又是一个 key observation:把
(−1)n−k−m 拆成
(−1)j−k 和
(−1)n−j−m
⟨nm⟩=j=0∑nk=0∑jkn(−1)j−k(−1)n−j−m(kj)(mn−j)
提出无关项
⟨nm⟩=j=0∑n(−1)n−j−m(mn−j)k=0∑jkn(−1)j−k(kj)
发现与
k 有关的和式为斯特林数,然后这个东西与 P5828 提到的第二个恒等式等价。
当然为什么在这里写这个公式呢,因为经过大量的推导之后,我们将一列的欧拉数化成了一个类似于卷积的东西。
当然还有一种做法是平移指数基变换,这里就不做过多补充。
这玩意能求对角线吗?
注意到根据欧拉数的对称性,求对角线等价于求一列。
附录
一些有关于排列相邻两数之间不等关系类问题都可以转化成欧拉数的模型,可以很好的列式子并且使用一些方法解决,具体而言可以见试看看部分。
试看看!