小孩召开法 题解

开题之前の一些废话:

小孩召开法,

旦写一北砬。

梦厷停留在,

破了大式様。

——龚诗锋《炄勺,砒》

小孩。

又是我很不会的排列计数。而且神题。久仰大名。

现在是 2 月 13 日晚上十点。那么不算今天我看我几天能开完。

搜索了一下 cnblogs 上的“小孩召开法”词条。然后发现了几个相关东西:

disangan233 的题解

一个同名题的题解

有人搬的 EI 博客

zero4338 的题解

yspm 题解和日记

joke3579 的三个鲜花和题解

fengwu 的“似乎是EGF,不会不会”

好开始越级做题。进行一个法的召开。

小孩召开法

题意:定义元素大小满足><><这样的子序列叫做交替子序列。求最长的交替子序列长度为 \(K\) 的长 \(n\) 的排列有多少个。\(n\le 10^{18},K\le 10^6\)

提示:龚诗锋,小万邦,小弟是一个人。

另注:千万不要在这道题上浪费太多时间。

题解

这题前半段有非常多匪夷所思的转化。总之就是非常震撼。

首先设答案是 \(f_{n,k}\)。首先显然至少有一个最长交替子序列经过最大值 \(n\)。考虑到如果有两个数跨过 \(n\),那么一定可以将更大的一个变成 \(n\)。那么枚举 \(n\) 的位置 \(i\) ,再枚举左右两边的交替子序列长度。令左边的交替子序列长度为 \(2r\)\(2r+1\)(因为 \(n\) 可以放在 \(2r+1\) 的位置),右边是 \(s\) ,可以得到:

\[f_{n,k}=\sum_{i=1}^n\binom{n-1}{i-1}\sum_{2r+1+s=k}(f_{i-1,2r}+f_{i-1,2r+1})f_{n-i,s} \]

那么容易列出答案的二元生成函数

\[F(x,y)=\sum_{n=0}\sum_{k=0}f_{n,k}\frac{x^n}{n!}y^k \]

分离奇偶项,也有:

\[F_0(x,y)=\frac{F(x,y)+F(x,-y)}2\qquad F_1(x,y)=\frac{F(x,y)-F(x,-y)}2 \]

同时我们根据上边的 dp 方程也可以得到如下关系式:

\[\frac{\partial F}{\partial x}=(yF_0+F_1)F \]

\[\frac{\partial F_0}{\partial x}=(yF_0+F_1)F_1 \]

\[\frac{\partial F_1}{\partial x}=(yF_0+F_1)F_0 \]

也就是对应相乘,最后右边的结果在 \(x^{n-1}\) 次项上所以左边要求个导左移一下系数。

然后我们发现(怎么发现的)一个奇妙的东西:

\[\begin{aligned} &\frac{\partial(F_0^2-F_1^2)}{\partial x}\\ =&\frac{\partial F_0^2}{\partial x}-\frac{\partial F_1^2}{\partial x}\\ =&2F_0\frac{\partial F_0}{\partial x}-2F_1\frac{\partial F_1}{\partial x}\\ =&2F_0F_1(yF_0+F_1)-2F_1F_0(yF_0+F_1)\\ =&0 \end{aligned} \]

也就是说这俩东西只有常数项不同。根据定义可以发现 \(F_0\) 常数项是 \(1\)\(F_1\)\(0\)。于是我们可以得到:

\[\begin{aligned} &F_0^2-F_1^2\\ =&\left(\frac {F(x,y)+F(x,-y)}2\right)^2-\left(\frac {F(x,y)-F(x,-y)}2\right)^2\\ =&F(x,y)F(x,-y)=1 \end{aligned} \]

\(F^{-1}(x,y)=F(x,-y)\)。此时观察原来的式子:

\[\begin{aligned} &\frac{\partial F}{\partial x}\\ =&(yF_0+F_1)F\\ =&\left(y\frac{F+F^{-1}}2+\frac{F-F^{-1}}2\right)F\\ =&\frac 12((y+1)F+(y-1)F^{-1})F\\ =&\frac 12((y+1)F^2+y-1) \end{aligned} \]

那么

\[\frac{\partial F}{(y+1)F^2+y-1}=\frac{\partial x}2 \]

\(F\) 的前缀和 \(G=\dfrac F{1-y}\),代入原式:

\[\begin{aligned} \frac{(1-y)\partial G}{(1+y)(1-y)^2G^2+y-1}&=\frac{\partial x}2\\ \frac{\partial G}{(1-y^2)G^2-1}&=\frac{\partial x}2 \end{aligned} \]

\(\alpha=\sqrt{1-y^2}\)

\[\begin{aligned} \frac{2\partial G}{(\alpha G)^2-1}&=\partial x\\ \partial G\left(\frac 1{\alpha G-1}-\frac 1{\alpha G+1}\right)&=\partial x\\ \partial (\alpha G)\left(\frac 1{\alpha G-1}-\frac 1{\alpha G+1}\right)&=\alpha \partial x\\ \end{aligned} \]

两边进行积分(两边微分算子不一样我也不知道这个积分对不对,我觉得是对的但是不知道为啥)

\[\begin{aligned} \ln\frac{\alpha G-1}{\alpha G+1}&=\alpha x+C\\ \frac{\alpha G-1}{\alpha G+1}&=Ce^{\alpha x}\\ G&=\frac{1+Ce^{\alpha x}}{\alpha(1-Ce^{\alpha x})}\\ G&=\frac 1{\alpha}\left(\frac 2{1-Ce^{\alpha x}}-1\right) \end{aligned} \]

考虑有没有什么法子把这个 \(C\) 搞出来。发现 \(x\) 代入 \(0\) 的时候 \(G\) 恰好是 \(\dfrac 1{1-y}\),于是有:(这一步详细过程我不是很能推出来,但是两边是对的,如果有人推出来了请解释一下)

\[\begin{aligned} \frac{1+C}{1-C}&=\frac{\alpha}{1-y}\\ C&=\frac{1-\alpha}y \end{aligned} \]

也就有了

\[G=\frac 1{\alpha}\left(\frac 2{1-\frac{1-\alpha}ye^{\alpha x}}-1\right) \]

那么显然常数项没什么用,扔了。

后边的东西就相对更加简单了,而且没有前面那么匪夷所思的转换。

\[\begin{aligned} &\frac 2{\alpha}\frac 1{1-\frac{1-\alpha}ye^{\alpha x}}\\ =&\frac 2{\alpha}\sum_{i=0}\left(\frac{1-\alpha}ye^{\alpha x}\right)^i\\ =&\frac 2{\alpha}\sum_{i=0}\left(\frac{1-\alpha}y\right)^i\sum_{j=0}\frac{(\alpha ix)^j}{j!}\\ =&2\sum_{i=0}y^{-i}\sum_{j=0}\frac{(ix)^j}{j!}(1-\alpha)^i\alpha^{j-1}\\ \end{aligned} \]

考察后边的东西:

\[\left(1-\sqrt{1-y^2}\right)^i\left(\sqrt{1-y^2}\right)^{j-1} \]

换元,设 \(4x=y^2\)

\[\left(1-\sqrt{1-4x}\right)^i\left(\sqrt{1-4x}\right)^{j-1} \]

事实上我们可以另类拉格朗日反演展开这个东西扒出来系数。

掏出我们应对 \(\sqrt{1-4x}\) 这种东西的二叉树方程 \(F=x(1+F)^2\),关于它有:

\[F=\frac{1-2x-\sqrt{1-4x}}{2x} \]

代入,得:

\[\begin{aligned} &\left(1-\sqrt{1-4x}\right)^i\left(\sqrt{1-4x}\right)^{j-1}\\ =&(2x+2xF)^i(1-2x-2xF)^{j-1}\\ =&\left(\frac{2F}{1+F}\right)^i\left(\frac{1-F}{1+F}\right)^{j-1}\\ =&2^iF^i(1-F)^{j-1}(1+F)^{-i-j+1} \end{aligned} \]

复合逆一目了然不言而喻。直接套另类拉格朗日反演:

\[\begin{aligned} &[x^n]F^i(1-F)^{j-1}(1+F)^{-i-j+1}\\ =&[x^n]x^i(1-x)^{j-1}(1+x)^{-i-j+1}\frac{1-x}{(1+x)^3}(1+x)^{2n+2}\\ =&[x^{n-i}](1-x)^j(1+x)^{2n-i-j}\\ =&\sum_{k=0}(-1)^k\binom ik\binom{2n-i-j}{n-i-k} \end{aligned} \]

那么代回去就是平凡的结论:

\[\begin{aligned} &2\sum_{i=0}y^{-i}\sum_{j=0}\frac{(ix)^j}{j!}\sum_{k=0}2^i\left(\frac{y^2}4\right)^k\sum_{l=0}(-1)^l\binom il\binom{2k-i-j}{k-i-l}\\ =&\sum_{i,j,k}2^{1-2k+i}\frac{(ix)^j}{j!}y^{2k-i}\sum_{l=0}(-1)^l\binom il\binom{2k-i-j}{k-i-l} \end{aligned} \]

那么只要提取 \([x^ny^k]\) 项系数(提醒一下,这是 \(G\))。令 \(n=j,k=2k-i\)

\[2^{1-k}\sum_{i,j}i^n(-1)^j\binom nj\binom{k-n}{\frac{k-i}2-j} \]

那么枚举一个 \(i\) 算后边的东西。设 \(s=n-k\),列出后边东西的生成函数:

\[F=(1-x)^n(1+x)^{-s} \]

求导表示自己:

\[\begin{aligned} F'=&-n(1-x)^{n-1}(1+x)^{-s}-s(1-x)^n(1+x)^{-s-1}\\ F'=&-\frac{nF}{1-x}-\frac{sF}{1+x}\\ (1-x^2)F'=&-nF(1+x)-sF(1-x) \end{aligned} \]

手动提取系数:

\[tf_t-(t-2)f_{t-2}=-nf_{t-1}-nf_{t-2}-sf_{t-1}+sf_{t-2} \]

\[tf_t=-(n+s)f_{t-1}+(s-n+t-2)f_{t-2} \]

最后的答案就是 \(g_{n,k}-g_{n,k-1}\)。复杂度根据实现可以做到 \(O(k\log n)\)\(O(k)\)。我写的一只 \(\log\) 的。

#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
const int mod=998244353;
long long n;
int k,ans,f[1000010];
int qpow(int a,int b){
    int ans=1;
    while(b){
        if(b&1)ans=1ll*ans*a%mod;
        a=1ll*a*a%mod;
        b>>=1;
    }
    return ans;
}
int get(long long n,int k){
    if(k<=0)return 0;
    f[0]=1;
    int ans=0,s=(n-k)%mod;
    for(int i=1;2*i<=k;i++){
        f[i]=(1ll*(mod-(n%mod+s)%mod)*f[i-1]%mod+1ll*(s-n%mod+i-2+mod)%mod*((i>=2)?f[i-2]:0))%mod;
        f[i]=1ll*f[i]*qpow(i,mod-2)%mod;
    }
    for(int i=k;i>=0;i-=2)ans=(ans+1ll*qpow(i,n%(mod-1))*f[(k-i)/2])%mod;
    ans=1ll*ans*qpow(2,(mod-k)%(mod-1))%mod;
    return ans;
}
int main(){
    scanf("%lld%d",&n,&k);
    ans=(get(n,k)-get(n,k-1)+mod)%mod;
    printf("%d\n",ans);
    return 0;
}
posted @ 2023-02-14 21:58  gtm1514  阅读(246)  评论(0编辑  收藏  举报