T2:无标号有根仙人掌计数,不会
倒是搞懂了O(n^2log n)无标号无根树计数
先考虑无标号有根树的计数
记dp[k]为当我dp到i时用1~i大小的树可以凑出k的方案数
则每次就拿dp[i]去更新dp[k],dp[k]+=[t=1...k/i]C(t,t+dp[i]-1)*dp[k-i*t]
解释:大小为i的树有dp[i]种,相当于求每个元素∈[1,dp[i]]的长为t的非降序列个数,即C(t,t+dp[i]-1)
听说还有母函数O(nlog^2n)的,不会
(这个推广一下就可以求有度数限制的树的个数
#include<bits/stdc++.h>
#define maxn 3010
using namespace std;
int dp[maxn],n,mod,f[maxn];
int qpow(int a,int b){
int ans=1,tmp=a;
for(;b;b>>=1,tmp=1ll*tmp*tmp%mod)
if(b&1)ans=1ll*ans*tmp%mod;
return ans;
}
int main(){
scanf("%d%d",&n,&mod),dp[1]=dp[0]=1;
for(int i=1;i<=n;++i){
for(int j=i+1;j<=n;++j)f[j]=dp[j];
for(int k=i,t=1,z=1;k<n;k&#