L Lndjy and the mex

题意:给定长度为 nn 的序列 {ai}\{a_i\},满足 ai=n\sum a_i=n。问由 a0a_000a1a_111,……,ana_nnn 构成的全部 n!i=0nai!\displaystyle \dfrac{n!}{\prod_{i=0}^n a_i!} 个序列中,每个序列的全部连续子序列的 mex\rm mex 值之和。n1×105n \leq 1\times 10^5

解法:显然直接求 mex\rm mex 是非常不好做的,尝试将其转化为方案数。设 fif_i 表示连续子序列的 mex\rm mex 值为 ii 的连续子序列个数,则答案为 i=0+ifi\displaystyle \sum_{i=0}^{+\infty}if_i,令 gi=j=i+fj\displaystyle g_i=\sum_{j=i}^{+\infty}f_j,则有:

i=0+ifi=i=1+i(gigi+1)=i=1+gi\begin{aligned} \sum_{i=0}^{+\infty}if_i=&\sum_{i=1}^{+\infty}i(g_{i}-g_{i+1})\\ =&\sum_{i=1}^{+\infty}g_i \end{aligned}

以上的化简是用到了 g+=0g_{+\infty}=0

注意到 gig_i 的组合意义为,连续子序列 mex\rm mex 值大于等于 ii 的序列个数,等价于 0i10 \sim i-1 的数字至少出现一次,其余数字随意的方案数。考虑到每个数字选了多少个,假设第 ii 个数字选了 bib_i 个,那么有:

gi=b0=1a0b1=1a1bi1=1ai1bi=0aibi+1=0ai+1bn=0an(j=0nbjb0,b1,,bn)(nj=0nbja0b0,a1b1,,anbn)(nj=0nbj+1)g_i=\sum_{b_0=1}^{a_0}\sum_{b_1=1}^{a_1}\cdots \sum_{b_{i-1}=1}^{a_{i-1}}\sum_{b_i=0}^{a_i}\sum_{b_{i+1}=0}^{a_{i+1}}\cdots \sum_{b_{n}=0}^{a_{n}} {\sum_{j=0}^n b_j \choose b_0,b_1,\cdots,b_n}{n-\sum_{j=0}^n b_j \choose a_0-b_0,a_1-b_1,\cdots,a_n-b_n}\left(n-\sum_{j=0}^nb_j+1\right)

即首先是连续子序列内部的排列,再是外部的排列,最后再将这个连续子序列插入完整的序列。那么这个问题就可以非常容易的使用 EGF 得到解决:设 fi(x)f_i(x) 表示数字 ii 的选择方案的 EGF,fi(x)=j=0aixjj!(aij)!\displaystyle f_i(x)=\sum_{j=0}^{a_i}\dfrac{x^j}{j!(a_i-j)!}gi(x)=fi(x)1ai!g_i(x)=f_i(x)-\dfrac{1}{a_i!} 表示至少选一个的方案,则最终的答案为:

s=0n(ns+1)!(s![xs]i=0n1j=0igj(x)j=i+1nfj(x))\sum_{s=0}^n(n-s+1)!\left(s![x^s]\sum_{i=0}^{n-1}\prod_{j=0}^{i}g_j(x)\prod_{j=i+1}^nf_j(x)\right)

注意:此处和通常的 EGF 稍有区别。正常的 EGF 由于不考虑外侧的排列,为 fi(x)=j=0aixjj!\displaystyle f_i(x)=\sum_{j=0}^{a_i}\dfrac{x^j}{j!}。而当选定连续子序列中数字个数确定,外侧也随之确定,他们的排列数为 (ns+1)!(aij)!\dfrac{(n-s+1)!}{(a_i-j)!},因而可以将此系数杂糅进 fi(x)f_i(x)

考虑使用分治 NTT 去计算上式:对于区间 (l,r)(l,r) 维护 F1(x,l,r)=i=lrgi(x),F2(x,l,r)=i=lrfi(x),F3(x,l,r)=i=lr1j=ligi(x)j=i+1rfi(x)\displaystyle F_1(x,l,r)=\prod_{i=l}^rg_i(x),F_2(x,l,r)=\prod_{i=l}^rf_i(x),F_3(x,l,r)=\sum_{i=l}^{r-1}\prod_{j=l}^{i}g_i(x)\prod_{j=i+1}^rf_i(x),则有 F3(x,l,r)=F1(x,l,m)F3(x,m+1,r)+F3(x,l,m)F2(x,m+1,r)F1(x,l,m)F2(x,m+1,r)F_3(x,l,r)=F_1(x,l,m)F_3(x,m+1,r)+F_3(x,l,m)F_2(x,m+1,r)-F_1(x,l,m)F_2(x,m+1,r)。因而可以 O(n2n)\mathcal O(n\log^2n) 的通过。

Poly f[N + 5], g[N + 5], gf[N + 5];
int a[N + 5];

void build(int place, int left, int right)
{
    if (left == right)
    {
        f[place].resize(a[left] + 1);
        for (int i = 0; i <= a[left]; i++)
            f[place][i] = 1ll * ifac[i] * ifac[a[left] - i] % P;
        g[place] = f[place];
        g[place][0] = 0;
        gf[place] = f[place] + g[place];
        return;
    }
    int mid = (left + right) >> 1;
    build(place << 1, left, mid);
    build(place << 1 | 1, mid + 1, right);
    f[place] = f[place << 1] * f[place << 1 | 1];
    g[place] = g[place << 1] * g[place << 1 | 1];
    gf[place] = g[place << 1] * gf[place << 1 | 1] + gf[place << 1] * f[place << 1 | 1] - g[place << 1] * f[place << 1 | 1];
}
int main()
{
    int n;
    scanf("%d", &n);
    for (int i = 0; i <= n;i++)
        scanf("%d", &a[i]);
    build(1, 0, n);
    Poly F = gf[1] - f[1];
    int ans = 0;
    for (int i = 1; i <= n; i++)
        ans = (ans + 1ll * (n - i + 1) * fac[i] % P * fac[n - i] % P * F[i]) % P;
    printf("%d", ans);
    return 0;
}