HW 2020.8.19笔试第二题
题目描述
给出二叉树上每个节点的深度,请你计算满足条件的二叉树共有多少种。
输入描述
第一行包含一个整数N,表示二叉树上节点的数量(1<=N<=1000)。
第二行包含N个整数,d1,d2,……dN,表示每个节点的深度(0<=di<=N-1)。
输出描述
输出满足条件的二叉树数量,因为答案可能非常大,你只需要输出答案除以 (10^9 + 7) 后得到的余数。
即如果最终答案为answer,你只需要输出answer mod (10^9 + 7) 。
示例1
输入:
4
1 0 2 2
输出:
2
说明:
有1个深度为1的节点,1个深度为0的节点和2个深度为2的节点,满足条件的二叉树共有两种,如下:
x x
/ \
x x
/ \ / \
x x x x
#include <iostream>
#include <vector>
using namespace std;
int pailie(int m, int n) { //计算排列组合
int fenmu = 1;
int fenzi = 1;
for (int i = n; i > 0; i--) {
fenmu *= i;
fenzi *= m--;
}
return fenzi/fenmu;
}
const int M = 1e9 + 7; //取模值
int main() {
int n;
cin >> n;
if (n < 1 || n>1000){ //边界判断
cout << 0 << endl;
return 0;
}
vector<int> num(n);
vector<int> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
++num[a[i]];
}
int res = 1;
int i = 1;
while (i<n && num[i]) {
if (num[i] > 2 * num[i - 1]) {
cout << 0 << endl;
return 0;
}
res*=pailie(2 * num[i - 1],num[i]);
i++;
}
cout << res % M << endl;
return 0;
}