Approach
Depth-first search
For Balanced K Factor Decomposition, the implementation follows one branch at a time, making it suitable for components, trees, backtracking, or dependency exploration.
- Define the state carried into one recursive or stack frame.
- Mark or choose the current state before exploring children.
- Combine child results or undo the choice when the branch finishes.
Code notes
- 129 lines of C++ from the credited upstream file balanced-k-factor-decomposition.cpp.
- The implementation visibly relies on sequence storage.
- 5 loop blocks detected.
Complexity
Count unique states for graph traversal; for backtracking, count the branching factor and maximum depth.
Check the problem constraints before deciding whether this complexity will pass.
Use this to learn the idea, then write your own version.
1234 56const auto& factors = [](int n) {7 vector<vector<int>> result(n + 1);8 for (int i = 1; i <= n; ++i) {9 for (int j = i; j <= n; j += i) {10 result[j].emplace_back(i);11 }12 }13 return result;14};15 16const int MAX_N = 1e5;17const auto& FACTORS = factors(MAX_N);18class Solution {19public:20 vector<int> minDifference(int n, int k) {21 vector<int> result, curr;22 function<void (int)> backtracking = [&](int remain) {23 const int start = !empty(curr) ? curr.back() : 1;24 if (size(curr) == k - 1) {25 if (remain >= start) {26 curr.emplace_back(remain);27 if (empty(result) || result.back() - result[0] > curr.back() - curr[0]) {28 result = curr;29 }30 curr.pop_back();31 }32 return;33 }34 const auto& factors = FACTORS[remain];35 for (auto it = lower_bound(cbegin(factors), cend(factors), start); it != cend(factors); ++it) {36 curr.emplace_back(*it);37 backtracking(remain / *it);38 curr.pop_back();39 }40 };41 42 backtracking(n);43 return result;44 }45};46 47484950class Solution2 {51public:52 vector<int> minDifference(int n, int k) {53 vector<int> result, curr;54 function<void (int)> backtracking = [&](int remain) {55 const int start = !empty(curr) ? curr.back() : 1;56 if (size(curr) == k - 1) {57 if (remain >= start) {58 curr.emplace_back(remain);59 if (empty(result) || result.back() - result[0] > curr.back() - curr[0]) {60 result = curr;61 }62 curr.pop_back();63 }64 return;65 }66 for (int i = 1; i * i <= remain; ++i) {67 if (remain % i) {68 continue;69 }70 const int j = remain / i;71 if (i >= start) {72 curr.emplace_back(i);73 backtracking(j);74 curr.pop_back();75 }76 if (j == i) {77 continue;78 }79 if (j >= start) {80 curr.emplace_back(j);81 backtracking(i);82 curr.pop_back();83 }84 }85 };86 87 backtracking(n);88 return result;89 }90};91 92939495class Solution3 {96public:97 vector<int> minDifference(int n, int k) {98 vector<int> result, curr;99 function<void (int)> backtracking = [&](int remain) {100 if (size(curr) == k - 1) {101 curr.emplace_back(remain);102 if (empty(result) || ranges::max(result) - ranges::min(result) > ranges::max(curr) - ranges::min(curr)) {103 result = curr;104 }105 curr.pop_back();106 return;107 }108 for (int i = 1; i * i <= remain; ++i) {109 if (remain % i) {110 continue;111 }112 const int j = remain / i;113 curr.emplace_back(i);114 backtracking(j);115 curr.pop_back();116 if (j == i) {117 continue;118 }119 curr.emplace_back(j);120 backtracking(i);121 curr.pop_back();122 }123 };124 125 backtracking(n);126 return result;127 }128};129