开题之前の一些废话:
小孩召开法,
旦写一北砬。
梦厷停留在,
破了大式様。
——龚诗锋《炄勺,砒》
小孩。
又是我很不会的排列计数。而且神题。久仰大名。
现在是 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;
}