link: https://loj.ac/problem/6185
随便DP一下就好了(我最近怎么越来越懒了2333)
注意当子树大小有相同的时候需要用可重组合。。
#include<bits/stdc++.h> #define ll long long #define maxn 405 using namespace std; const int ha=1000000007; int f[maxn],n,m,inv[10]; inline int add(int x,int y){ x+=y; return x>=ha?x-ha:x; } inline int C(int x,int y){ if(x<y) return 0; int an=1; for(int i=1;i<=y;i++) an=an*(ll)(x-i+1)%ha*(ll)inv[i]%ha; return an; } inline void dp(){ f[0]=1; for(int i=1;i<=n;i++){ int ans=0,tmp=i-1; if(!(tmp%3)) ans=add(ans,C(add(f[tmp/3],2),3)); int tp=tmp>>1; for(int j=0,u;j<=tp;j++){ u=tmp-(j<<1); if(u!=j) ans=add(ans,C(add(f[j],1),2)*(ll)f[u]%ha); } for(int j=0;j<i;j++) for(int k=j+1,u;(u=tmp-j-k)>k;k++){ ans=add(ans,f[j]*(ll)f[k]%ha*(ll)f[u]%ha); } f[i]=ans; } } int main(){ inv[1]=1; for(int i=2;i<=4;i++) inv[i]=-inv[ha%i]*(ll)(ha/i)%ha+ha; scanf("%d",&n); dp(); printf("%d\n",f[n]); return 0; }