关于析合树计数

CF1089I Interval-Free Permutations

  • 求长度为 \(n\) 的、且不包含一个连续子段的排列数量。

用析合树的思路,将问题转化为计算根的儿子不足 \(n\) 个的析合树数量。

设长度为 \(n\) 的、且不包含一个连续子段的排列数量是 \(A_n\)

先讨论根是合点的情况:

\(I_i\) 表示长为 \(i\) 的序列,它的任意一个前缀都不是 \([1,i]\) 的连续段的排列数,有:

\[I=n!-\sum_{i=1}^{n-1}I_i \times (n-i)! \]

进而,枚举根最左边的儿子,可得根节点为合点、儿子递增的析合树个数:

\[\sum_{i=1}^{n-1}I_i*(n-i)! \]

将儿子递增的析合树反转可得到儿子递减的析合树,加和得到总方案数:

\[2\times \sum_{i=1}^{n-1}I_i*(n-i)! \]

然后看根是析点的情况:

\(B_{i,j}\) 表示把 \(n\) 个点划分到 \(i\) 个儿子里的方案数,先不考虑儿子间是否形成连续段,枚举最左边儿子的大小,有:

\[B_{n,i}=\sum_{j=1}^{n-1}B_{n-j,i-1}\times j! \]

进而,有:

\[A_n=n!-2\times \sum_{i=1}^{n-1}I_i*(n-i)!-\sum_{i=4}^{n-1}A_i\times B_{n,i} \]

因为儿子数小于 \(4\) 的析点根本不存在,因此根是析点的情况可以直接从 \(4\) 开始求和

点击查看代码
#include<bits/stdc++.h>
using namespace std;
int T,md,n=400;
int I[405],A[405],B[405][405],fac[405];
inline void init(){
	fac[0]=fac[1]=1;I[0]=1;B[0][0]=1;
	for(int i=2;i<=n;i++)fac[i]=1ll*fac[i-1]*i%md;
	for(int i=1;i<=n;i++){
		I[i]=fac[i];
		for(int j=1;j<i;j++)I[i]=(I[i]-1ll*I[j]*fac[i-j])%md;
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=i;j++){
			for(int t=1;t<=i;t++)B[i][j]=(B[i][j]+1ll*B[i-t][j-1]*fac[t])%md;
		}
	}A[1]=1;A[2]=2;A[3]=0;
	for(int i=4;i<=n;i++){
		A[i]=fac[i];
		for(int j=1;j<i;j++)A[i]=(A[i]-2ll*I[j]*fac[i-j])%md;
		for(int j=4;j<i;j++)A[i]=(A[i]-1ll*B[i][j]*A[j])%md;
	}
}
int main(){
	scanf("%d%d",&T,&md);init();
	while(T--){
		int x;scanf("%d",&x);
		printf("%d\n",(A[x]+md)%md);
	}

	return 0;
}

2018 EC Final B. Mysterious … Host

  • 求大小为 \(i\) 的本质不同析合树形态数。

枚举最左边儿子的大小,暴力卷积就好了,如果同一个位置的点,一个是析点,一个是合点,对应的析合树是本质不同的

因此儿子数大于 \(4\) 的点要算两遍

点击查看代码
#include<bits/stdc++.h>
using namespace std;
int n,md;
int ans[5005],f2[5005],f3[5005],f4[5005];
int main(){
	scanf("%d%d",&n,&md);
	ans[1]=1;
	for(int i=2;i<=n;i++){
		for(int j=1;j<i;j++)f2[i]=(f2[i]+1ll*ans[j]*ans[i-j])%md;
		for(int j=1;j<i;j++)f3[i]=(f3[i]+1ll*ans[j]*f2[i-j])%md;
		for(int j=1;j<i;j++)f4[i]=(f4[i]+1ll*ans[j]*(f3[i-j]+f4[i-j]))%md;
		ans[i]=(1ll*f2[i]+1ll*f3[i]+2ll*f4[i])%md;
	}
	for(int i=1;i<=n;i++)printf("%d ",ans[i]);

	return 0;
}
posted @ 2021-12-16 15:38  一粒夸克  阅读(168)  评论(0编辑  收藏  举报