Stack

Question

Stack

定义 f(p) 为对排列 p 跑一次单调栈之后栈中剩余元素的个数,求长度为 n 的所有排列的 (f(p))3 的和,一共有 T 组询问

Solution

借鉴了牛课讨论区的一个大佬的做法:链接

定义了 g(n,i) 表示长度为 n 的所有排列中 f(p)=i 的个数,我们要求的答案就是 S(n)=i=1ng(n,i)×i3

这是第一类斯特林数的一个定义,得到 g(n+1,i)=ng(n,i)+g(n,i1)

试着计算 S(n+1) 的递推式

S(n+1)=i=1n+1g(n,i)×i3=ni=1n+1i3×g(n,i)+i=0ng(n,i)×(i+1)3=ni=1ni3×g(n,i)+i=1ng(n,i)×(i3+3i2+3i+1)=(n+1)i=1ng(n,i)×i3+3i=1ng(n,i)×i2+3i=1ng(n,i)×i+i=1ng(n,i)

已知 i=1ng(n,i) 表示所有排列方案,即 n!

然后观察到,i=1ng(n,i)×i3 就是 S(n),但是 i=1ng(n,i)×i2i=1ng(n,i)×i 未知,我们分别把他们定义为 S2(n)S1(n) 寻找他们的递推式

S2(n+1)=i=1n+1g(n,i)×i2=ni=1n+1i2×g(n,i)+i=0ng(n,i)×(i+1)2=ni=1ni2×g(n,i)+i=1ng(n,i)×(i2+2i+1)=(n+1)i=1ng(n,i)×i2+2i=1ng(n,i)×i+i=1ng(n,i)=(n+1)S2(n)+2S1(n)+n!S1(n+1)=i=1n+1g(n,i)×i=ni=1n+1i2×g(n,i)+i=0ng(n,i)×(i+1)=(n+1)i=1ng(n,i)×i+n!=(n+1)S1(n)+n!

于是我们得到了递推式

S(n)=nS(n1)+3S2(n1)+3S1(n1)+(n1)!S2(n)=nS2(n1)+2S1(n1)+(n1)!S1(n)=nS1(n1)+(n1)!

其中 S(0)=S1(0)=S2(0)=0