var numFactoredBinaryTrees = function (arr) {
let n = arr.length;
let dp = new Array(n).fill(1)
let base = 1000000007
let valueMap = new Map();
arr.sort((a, b) => {
return a - b
})
for (let i = 0; i < n; i++) { //建立 值 - 以当前值为根树 关系
valueMap[arr[i]] = i //给定一个值,取到其在dp数组中的下标
}
for (let i = 1; i < n; i++) {
// 取某值做根
for( let j = 0; j<i; j++){
//遍历所有小于该根的因子
if(arr[i] % arr[j] == 0){//如果因子合理,可与另一个因子组成叶子节点
if(valueMap.hasOwnProperty(arr[i] / arr[j])){
dp[i] = (dp[i] + dp[j] * dp[valueMap[arr[i] /arr[j]]] ) % base //当前数值自己做根 + 所有合理的左右子树数量
}
}
}
}
let res = 0;
for (let i = 0; i < n; ++i)
{
res = (res + dp[i]) % base;
}
return res;
};