http://115.28.76.232/problem?pid=1412
2-3 tree is an elegant data structure invented by John Hopcroft. It is designed to implement the same functionality as the binary search tree. 2-3 tree is an ordered rooted tree with the following properties:
The only exception is the tree that contains exactly one vertex — in this case the root of the tree is the only vertex, and it is simultaneously a leaf, i.e. has no children. The main idea of the described properties is that the tree with l leaves has the height O(log l).
Given the number of leaves l there can be several valid 2-3 trees that have l leaves. For example, the picture below shows the two possible 2-3 trees with exactly 6 leaves.
Given l find the number of different 2-3 trees that have l leaves. Since this number can be quite large, output it modulo r.
6 1000000000 7 1000000000
2 3
//时间O(n*n) #include <stdio.h> #include <cstring> #include <cmath> #include <vector> #include <algorithm> #define maxn 5005 #define eps 1e-10 #define LL long long using namespace std; int n,mod,c[2505][2505]; void init() { for(int i=1; i<=2500; i++) { c[0][i]=c[i][i]=1; } for(int i=2; i<=2500; i++) { for(int j=1; j<=i/2; j++) { c[i-j][i]=(c[j][i-1]+c[j-1][i-1])%mod; c[j][i]=c[i-j][i]; } } } LL dp[15][maxn],minn,maxx; int main() { while(~scanf("%d%d",&n,&mod)) { init(); memset(dp,0,sizeof(dp)); dp[0][1]=minn=maxx=1LL; for(int k=1;k<15;k++)//树的深度 { if(minn*2>n) break; for(int i=minn;i<=maxx;i++)//上一层的最小和最大的节点数 for(int j=i*2;j<=i*3&&j<=n;j++)//由上一层推下一层 { dp[k][j]+=dp[k-1][i]*c[i*3-j][i]; dp[k][j]%=mod; } minn*=2; maxx*=3; maxx=maxx<n?maxx:n; } int ans=0; for(int i=0;i<15;i++) ans=(ans+dp[i][n])%mod; printf("%d\n",ans); } return 0; }