Computer >> Máy Tính >  >> Lập trình >> C ++

Cây nhị phân với các yếu tố trong C ++

Giả sử chúng ta có một danh sách các số nguyên dương; có giá trị lớn hơn 1. Chúng ta sẽ tạo một cây nhị phân, sử dụng các số nguyên này và mỗi số có thể được sử dụng nhiều lần tùy ý. Mỗi nút không phải là sản phẩm của các nút con của nó. Vậy chúng ta phải tìm xem chúng ta có thể làm được bao nhiêu cây? Câu trả lời sẽ được trả về trong modulo 10 ^ 9 + 7. Vì vậy, nếu đầu vào là [2,4,5,10], thì câu trả lời sẽ là 7, vì chúng ta có thể tạo ra 7 cây như [2], [4] , [5], [10], [4,2,2], [10,2,5], [10,5,2]

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

  • Xác định dp bản đồ
  • sắp xếp mảng A, n:=kích thước của mảng A, ret:=0
  • cho tôi trong phạm vi từ 0 đến n - 1
    • tăng dp [A [i]] lên 1
    • cho j trong phạm vi từ 0 đến j - 1
      • nếu A [i] mod A [j] =0, thì
        • dp [A [i]]:=dp [A [i]] + (dp [A [j]] * dp [A [i]] / dp [A [j]])
    • ret:=ret + dp [A [i]]
  • trả lời lại

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

Ví dụ

#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
const int MOD = 1e9 + 7;
int add(lli a, lli b){
   return ((a % MOD) + (b % MOD)) % MOD;
}
int mul(lli a, lli b){
   return ((a % MOD) * (b % MOD)) % MOD;
}
class Solution {
   public:
   int numFactoredBinaryTrees(vector<int>& A) {
      unordered_map <int, int> dp;
      sort(A.begin(), A.end());
      int n = A.size();
      int ret = 0;
      for(int i = 0; i < n; i++){
         dp[A[i]] += 1;
         for(int j = 0; j < i; j++){
            if(A[i] % A[j] == 0){
               dp[A[i]] = add(dp[A[i]], mul(dp[A[j]], dp[A[i] / A[j]]));
            }
         }
         ret = add(ret, dp[A[i]]);
      }
      return ret;
   }
};
main(){
   vector<int> v1 = {2,4,5,10};
   Solution ob;
   cout << (ob.numFactoredBinaryTrees(v1));
}

Đầu vào

[2,4,5,10]

Đầu ra

7