题意:问你指定二叉树有几种
1、高度为k
2、节点数为n
3、每个点的度为0或2
爆搜-------》30分QAQ
首先,因为每个节点度为0或2,
所以如果n是偶数直接输出0就行了吧(嘿嘿)
如果是奇数呢?
设f[i][j]表示i个节点,高度$le$j的方案数
那么$ans=f[n][k]-f[n][k-1]$(类似于前缀)
转移$f[i][j]=f[t][j-1]*f[i-t-1][j-1]$
枚举t,t个放左边,j-t-1个放右边,乘法原理,别忘取模
#include<cstdio> #include<iostream> #include<cstring> #include<cctype> #include<algorithm> using namespace std; #define olinr return #define _ 0 #define love_nmr 0 #define DB double #define mod 9901 inline int read() { int x=0,f=1; char ch=getchar(); while(!isdigit(ch)) { if(ch=='-') f=-f; ch=getchar(); } while(isdigit(ch)) { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); } return x*f; } inline void put(int x) { if(x<0) { x=-x; putchar('-'); } if(x>9) put(x/10); putchar(x%10+'0'); } int n; int k; int f[250][250]; int main() { n=read(); k=read(); if(!(n&1)) { put(0); olinr ~~(0^_^0)+love_nmr; } for(int i=1;i<=k;i++) //注意初始化 f[1][i]=1; for(int i=1;i<=k;i++) for(int j=3;j<=n;j+=2) //奇数不存在 for(int k=1;k<j;k+=2) (f[j][i]+=f[k][i-1]*f[j-k-1][i-1])%=mod; put((f[n][k]-f[n][k-1]+mod)%mod); olinr ~~(0^_^0)+love_nmr; }