# 823. 带因子的二叉树

给出一个含有不重复整数元素的数组,每个整数均大于 1。

我们用这些整数来构建二叉树,每个整数可以使用任意次数。

其中:每个非叶结点的值应等于它的两个子结点的值的乘积。

满足条件的二叉树一共有多少个?返回的结果应模除 10 ** 9 + 7。

示例 1:

输入: A = [2, 4]
输出: 3
解释: 我们可以得到这些二叉树: [2], [4], [4, 2, 2]

示例 2:

输入: A = [2, 4, 5, 10]
输出: 7
解释: 我们可以得到这些二叉树: [2], [4], [5], [10], [4, 2, 2], [10, 2, 5], [10, 5, 2].

提示:

1 <= A.length <= 1000.

2 <= A[i] <= 10 ^ 9.

/**
 * @param {number[]} array
 * @return {number}
 */
var numFactoredBinaryTrees = function(array) {
  const MOD = Math.pow(10, 9) + 7;
  const len = array.length;
  array = array.sort((a, b) => a - b);
  const dp = Array.from({ length: len }, () => 1);
  const map = new Map();
  for (let i = 0; i < len; i++) {
    map.set(array[i], i)
  }
  for (let i = 0; i < len; i++) {
    for (let j = 0; j < i; j++) {
      if (array[i] % array[j] == 0) {  // A[j] is left child
        const right = array[i] / array[j];
        if (map.has(right)) {
          dp[i] = (dp[i] + dp[j] * dp[map.get(right)]) % MOD;
        }
      }
    }
  }

  console.log(dp, 'dp')
  let sum = dp.reduce((pre, cur) => {
    return pre + cur;
  }, 0)
  return sum % MOD;
};


const array = [2,3,4,5,6,7,8,16,17]

console.log(numFactoredBinaryTrees(array))

总结:

这道题还是很难,动态规划的思想还是没有很懂,如果理解了动态规划的话,基本很快就写出来了。