烷基计数&烷烃计数(n^2算法)
烷基计数问题
求每个节点的儿子不超过三个,且大小为的有根树的数量。
设为总共个节点,根节点度数为的方案数。
考虑从枚举一个当前最大的子树大小和选的个数,把他接在原来的部分方案上。
于是就有
其中H为可重复的组合数,即代表个选个可重复选的方案数,因为需要考虑子树的同构。
满足
证明见文末。
倒着枚举点的个数不会算重。
最后答案即是.
ll H(int a,int b){
if(b==0) return 1;
if(b==1) return a;
if(b==2) return (ll)ny(2)*(a+1)%mod*a%mod;
if(b==3) return (ll)ny(6)*(a+1)%mod*(a+2)%mod*a%mod;
}
int MAIN(){
cin>>N;
f[1][0]=1;
for(int sz=1;sz<N;sz++){
for(int i=N;i;i--){
for(int j=1;j<=3&&j<i;j++){
for(int k=1;k*sz+1<=i&&k<=j;k++){
int s=0;
for(int p=0;p<=3;p++) s=((ll)s+f[sz][p])%mod;
f[i][j]=((ll)f[i][j]+f[i-sz*k][j-k]*H(s,k)%mod)%mod;
}
}
}
}
ll ans=0;
for(int i=0;i<=3;i++) ans+=f[N][i];
cout<<ans%mod<<endl;
return 0;
}
烷烃计数问题
求每个节点的度数不超过四,且大小为的无根树的数目。
考虑将所有无根树的一个重心作为根(显然重心只有一或二个),形成有根树。
这样做一定会满足每棵子树大小不超过。
这时需要修改的定义,即总共个节点,根的度数为且满足子树大小小于的方案数。
计算时sz必须满足
为什么是?
分类讨论一下:
当重心只有一个时:此时最大子树大小为
当重心有两个时:此时的所有情况都被计算了。
所以这样是刚好把条件全部满足的。
接下来统计答案:
当重心只有一个时,答案为.
当重心有两个时,此时n一定是偶数,两个重心相邻且子树大小均为(重心的基本性质)。
所以答案需要额外加上
ll H(int a,int b){
if(b==0) return 1;
if(b==1) return a;
if(b==2) return (ll)ny(2)*(a+1)%mod*a%mod;
if(b==3) return (ll)ny(6)*(a+1)%mod*(a+2)%mod*a%mod;
if(b==4) return (ll)ny(24)*(a+1)%mod*(a+2)%mod*(a+3)%mod*a%mod;
}
int MAIN(){
cin>>N;
f[1][0]=1;
for(int sz=1;sz<(N+1)/2;sz++){
for(int i=N;i;i--){
for(int j=1;j<=4&&j<i;j++){
for(int k=1;k*sz+1<=i&&k<=j;k++){
int s=0;
for(int p=0;p<=3;p++) s=((ll)s+f[sz][p])%mod;
f[i][j]=((ll)f[i][j]+f[i-sz*k][j-k]*H(s,k)%mod)%mod;
}
}
}
}
ll ans=0;
for(int i=0;i<=4;i++) ans+=f[N][i];
if(N%2==0){
int ret=0;
for(int i=0;i<=3;i++) ret=(ret+f[N>>1][i])%mod;
ans+=H(ret,2);
}
cout<<ans%mod<<endl;
return 0;
}
证明:
不妨设要在长度为的排列中可重复地选择项,成为数列{}。
不妨设{}满足
令
则有且
所以相当于在中选择不重复的项构成.
于是即证.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!