题目:这里写链接内容
思路:如果一个结点有两个儿子,很容易确定树的形态,当有一个儿子结点的时候,会有两种可能的情况(左儿子/右儿子),所以只需要统计有一个儿子结点的数量,2次方
代码:
#include<bits/stdc++.h>
using namespace std;
int a[10005][1005];
void System()
{
a[0][1] = 1;
for(int i = 1;i < 10005;i++)
{
for(int j = 1;j < 1005;j++)
{
//if(j == 1)
//a[i][j] += a[i-1][j]*2 + 1;
//else
a[i][j] += a[i-1][j]*2;
a[i][j+1] += a[i][j] / 10000;
a[i][j] = a[i][j] % 10000;
}
}
}
int main()
{
System();
int n,x;
vector<int> aa,b;
scanf("%d",&n);
for(int i = 1;i <= n;i++)
scanf("%d",&x),aa.push_back(x);
for(int i = 1;i <= n;i++)
scanf("%d",&x),b.push_back(x);
int cnt = 0;
int pos = b.size()-1;
for(int i = 1;i < b.size();i++)
{
int p = find(b.begin(),b.end(),aa[i])-b.begin();
if(p == pos-1)
cnt++;
pos = p;
}
//printf("%d\n",cnt);
int i = 1000;
while(a[cnt][i] == 0)
i--;
printf("%d",a[cnt][i]);
for(int j = i-1;j >= 1;j--)
printf("%04d",a[cnt][j]);
printf("\n");
return 0;
}