【题意】给定n个点的树,定义S为大小为k的点集,则f(S)为最小的包含点集S的连通块大小,求k=1~n时的所有点集f(S)的和取模924844033。n<=2*10^5。
【算法】排列组合+NTT
【题解】考虑每个点只会在k个点都在其一个子树时无贡献,即:
$$ANS_k=sum_{x=1}^{n}inom{n}{k}-sum_{y}inom{sz[y]}{k}+inom{n-sz[y]}{k}$$
令$cnt_i$表示满足sz[x]=i或n-sz[x]=i的数量,那么只需要计算:
$$ans_k=sum_{i=k}^{n}cnt_i*inom{i}{k}$$
拆分组合数:
$$k!ans_k=sum_{i=k}^{n}frac{cnt_i*i!}{(i-k)!}$$
令:
$$A_x=cnt_x*x!,xin[1,n]$$
$$B_x=frac{1}{x!},xin[1,n]$$
令B'表示数组B的反转,那么可以写成:
$$C_k=sum_{i=k}^{n}A_i*B_{i-k}=sum_{i=k}^{n}A_i*B'_{n+k+1-i}$$
扩展上下界:
$$D_{n+k+1}=sum_{i=0}^{n+k+1}A_i*B'_{n+k+1-i}$$
用NTT处理即可,原根为5。
复杂度O(n log n)。