classSolution{public:intnumFactoredBinaryTrees(vector<int>&arr){constexprintkMod=1'000'000'007;constintn=arr.size();// dp[i] := # of binary trees with arr[i] as rootvector<long>dp(n,1);unordered_map<int,int>numToIndex;sort(begin(arr),end(arr));for(inti=0;i<n;++i)numToIndex[arr[i]]=i;for(inti=0;i<n;++i)// arr[i] is rootfor(intj=0;j<i;++j)if(arr[i]%arr[j]==0){// arr[j] is left subtreeconstintright=arr[i]/arr[j];if(numToIndex.count(right)){dp[i]+=dp[j]*dp[numToIndex[right]];dp[i]%=kMod;}}returnaccumulate(begin(dp),end(dp),0L)%kMod;}};
classSolution{publicintnumFactoredBinaryTrees(int[]arr){finalintkMod=1_000_000_007;finalintn=arr.length;// dp[i] := # of binary trees with arr[i] as rootlong[]dp=newlong[n];Map<Integer,Integer>numToIndex=newHashMap<>();Arrays.sort(arr);Arrays.fill(dp,1);for(inti=0;i<n;++i)numToIndex.put(arr[i],i);for(inti=0;i<n;++i)// arr[i] is rootfor(intj=0;j<i;++j)if(arr[i]%arr[j]==0){// arr[j] is left subtreefinalintright=arr[i]/arr[j];if(numToIndex.containsKey(right)){dp[i]+=dp[j]*dp[numToIndex.get(right)];dp[i]%=kMod;}}return(int)(Arrays.stream(dp).sum()%kMod);}}
classSolution:defnumFactoredBinaryTrees(self,arr:List[int])->int:kMod=1_000_000_007n=len(arr)# dp[i] := # Of binary trees with arr[i] as rootdp=[1]*narr.sort()numToIndex={a:ifori,ainenumerate(arr)}fori,rootinenumerate(arr):# arr[i] is rootforjinrange(i):ifroot%arr[j]==0:# arr[j] is left subtreeright=root//arr[j]ifrightinnumToIndex:dp[i]+=dp[j]*dp[numToIndex[right]]dp[i]%=kModreturnsum(dp)%kMod