diff --git a/Medium/823. Binary Trees With Factors/README.md b/Medium/823. Binary Trees With Factors/README.md new file mode 100644 index 0000000..9d41c49 --- /dev/null +++ b/Medium/823. Binary Trees With Factors/README.md @@ -0,0 +1,26 @@ +

823. Binary Trees With Factors


+Medium

+ +Given an array of unique integers, arr, where each integer arr[i] is strictly greater than 1. + +We make a binary tree using these integers, and each number may be used for any number of times. Each non-leaf node's value should be equal to the product of the values of its children. + +Return the number of binary trees we can make. The answer may be too large so return the answer modulo 109 + 7. +
+ +Example 1:
+Input: arr = [2,4]
+Output: 3
+Explanation: We can make these trees: [2], [4], [4, 2, 2] +
+ +Example 2:
+Input: arr = [2,4,5,10
+Output: 7
+Explanation: We can make these trees: [2], [4], [5], [10], [4, 2, 2], [10, 2, 5], [10, 5, 2]. +
+ +Constraints:
+1. <= arr.length <= 1000
+2. <= arr[i] <= 109
+All the values of arr are unique. diff --git a/Medium/823. Binary Trees With Factors/Solution.java b/Medium/823. Binary Trees With Factors/Solution.java new file mode 100644 index 0000000..eedf221 --- /dev/null +++ b/Medium/823. Binary Trees With Factors/Solution.java @@ -0,0 +1,32 @@ +public class Solution { + // Method to count the number of binary trees that can be formed + public int numFactoredBinaryTrees(int[] arr) { + // Sort the array + Arrays.sort(arr); + // Create a map to store the count of subtrees for each element + Map subtreeCount = new HashMap<>(); + for (int root : arr) { + subtreeCount.put(root, 1L); + for (int factor : arr) { + if (factor >= root) { + break; + } + + /* Check if the current factor is a factor of the root + * and if the root/factor is present in the map */ + if (root % factor == 0 && subtreeCount.containsKey(root / factor)) { + // Update the subtree count for the current root + subtreeCount.put(root, + (subtreeCount.get(root) + subtreeCount.get(factor) * subtreeCount.get(root / factor))); + } + } + } + + long totalTrees = 0L; + for (int key : subtreeCount.keySet()) { + totalTrees = (totalTrees + subtreeCount.get(key)) % 1_000_000_007; + } + + return (int) totalTrees; + } +}