欧拉数小记
模拟赛考到了这个,感觉太厉害啦!来写一点东西,以防自己以后看不懂了。
欧拉数:定义一个排列 \(p\) 的升高为 \(\sum\limits_{i=1}^{n-1}[p_i<p_{i+1}]\),那么欧拉数 \(\left\langle\begin{matrix}n\\k\end{matrix}\right\rangle\) 就代表满足升高为 \(k\) 的长度为 \(n\) 的排列的数量。
可能有点抽象,我们举个例子:比如 \(\left\langle\begin{matrix}4\\2\end{matrix}\right\rangle=11\),因为我们可以找出 11 个满足升高为 2 的排列:\(\{1,3,2,4\},\{1,4,2,3\},\{2,3,1,4\},\{2,4,1,3\},\{3,4,1,2\},\{1,2,4,3\},\{1,3,4,2\},\{2,3,4,1\},\{2,1,3,4\},\{3,1,2,4\},\{4,1,2,3\}\)。
好,接下来我们将重点放在怎么求欧拉数上。因为这是一个排列,我们考虑一个从小到大插入的过程。显然新加入的数如果不在最后一定会新产生一个升高。稍微对新产生的升高与被破坏的升高分类讨论一下就可以得到一个基础的式子:
-
插入到最左边,不会产生升高,从 \(\left\langle\begin{matrix}n-1\\k\end{matrix}\right\rangle\) 转移过来;
-
插入到最右边,产生一个升高,从 \(\left\langle\begin{matrix}n-1\\k-1\end{matrix}\right\rangle\) 转移过来;
-
插入到一个升高中,新产生的升高与原来的抵消,从 \(\left\langle\begin{matrix}n-1\\k\end{matrix}\right\rangle\) 转移过来。原来有 \(k\) 个升高,所以有 \(k\) 种选法;
-
不插入到一个升高中,新产生一个升高,从 \(\left\langle\begin{matrix}n-1\\k-1\end{matrix}\right\rangle\) 转移过来。原来有 \(k-1\) 个升高,所以有 \((n-1)-1-(k-1)=n-k-1\) 种选法;
综上所述,可以得到一个最基本的递推式:
这样我们就有了一个 \(\mathcal{O}(n^2)\) 的 DP 求欧拉数的方法。
这个式子已经可以过掉 P2401 和 UVA1485 了,但是我们还需要更快的做法。
直接瞪这个式子得不到什么结论,可以手玩几个较小的例子猜一猜结论,比如 \(k\le 1\)。显然 \(\left\langle\begin{matrix}n\\0\end{matrix}\right\rangle=1\)。
算 \(\left\langle\begin{matrix}n\\1\end{matrix}\right\rangle\) 可以这样:我们钦定小于号放在了第 \(i\) 和 \(i+1\) 个之间,剩下两边肯定都是下降排列的,只要知道了具体选什么数就可以唯一确定,这一部分方案数是 \(\sum\limits_{i=1}^{n-1}\dbinom{n}{i}\)。但是这样做可能会出现没有小于号的情况,也就是 \(\{n,n-1,\ldots 1\}\) 并不合法,且被计算了 \(n-1\) 次,需要减掉,即 \(\left\langle\begin{matrix}n\\1\end{matrix}\right\rangle=\left(\sum\limits_{i=1}^{n-1}\dbinom{n}{i}\right)-(n-1)\)。
注意到前面那一坨是二项式定理的样子,故 \(\left\langle\begin{matrix}n\\1\end{matrix}\right\rangle=\left(\sum\limits_{i=0}^{n}\dbinom{n}{i}\right)-\dbinom{n}{0}-\dbinom{n}{n}-(n-1)=2^n-n-1\)。
实际上,我们可以更大胆一些:我们直接猜 \(\left\langle\begin{matrix}n\\k\end{matrix}\right\rangle=\sum\limits_{i=0}^k(-1)^i\dbinom{n+1}{i}(k+1-i)^n\)。经过试验,我们发现它应该是对的,下面尝试用归纳法证明。
回到上面那个 \(\mathcal{O}(n^2)\) 的式子。假设我们已经对 \(\left\langle\begin{matrix}n-1\\k\end{matrix}\right\rangle\) 和 \(\left\langle\begin{matrix}n-1\\k-1\end{matrix}\right\rangle\) 证明了上述结论,可以证明 \(\left\langle\begin{matrix}n\\k\end{matrix}\right\rangle\) 也有同样的结论。
发现最后一个式子的形式格格不入,考虑枚举原来的 \(i+1\) 作为现在的 \(i\)。
这里,上一步可以把最后一个式子改为从 0 开始枚举是因为在 \(i=0\) 时 \(\dbinom{n}{i-1}=0\)。
把式子们的公因式提出来:
进行一个式子的拆:
至此,原结论得证。
(说点闲话:感觉这样推导十分自然,并不需要过多的变形。)
知道这个结论以后,我们就可以利用快速幂 \(\mathcal{O}(n\log n)\) 单点求欧拉数,这道题(loj2834)也就迎刃而解了。
当然,由于幂函数是完全积性函数,且指数固定为 \(n\)。在模数为质数时,我们可以线性预处理组合数和幂函数,时间复杂度 \(\mathcal{O}(\frac{n}{\ln n}\log n+n)=\mathcal{O}(n)\)。
当然,欧拉数还有更高深的应用,比如求一行/一列/对角线的值。由于笔者实力有限,这里就不展开了。
关于欧拉数的公式,还有一种神奇的证明,详见 EI 的博客 或 hyl 的博客。
参考资料:Karry5307 浅谈欧拉数