Suppose we can primes [2, 3, 5]. We should get [2, 3, 5, 6, 10, 15, 30].
1: First method, solve it recursively.
#include "header.h"
using namespace std;
void primeProduct(vector<int>& nums, vector<int>& res, int product, int pos) {
if(pos > nums.size()) {
return;
}
if(product != 1) {
res.push_back(product);
}
for(int i = pos; i < nums.size(); ++i) {
if(i > pos && nums[i] == nums[i-1]) continue;
primeProduct(nums, res, product * nums[i], i + 1);
}
}
vector<int> primeProduct(vector<int>& nums) {
vector<int> res;
int product = 1;
int pos = 0;
primeProduct(nums, res, product, 0);
return res;
}
int main(void) {
vector<int> nums{2, 3, 5};
vector<int> res = primeProduct(nums);
for(int i = 0; i < res.size(); ++i) {
cout << res[i] << " ";
}
cout << endl;
}
2: Solve is iteratively using bitmap, same idea as subset.
#include "header.h"
using namespace std;
vector<int> uniquePrimes(vector<int>& primes) {
int n = primes.size();
int mask = 1 << n;
vector<int> res;
for(int i = 1; i < mask; ++i) {
int product = 1;
for(int j = 0; j < primes.size(); ++j) {
if(i & (1 << j)) product *= primes[j];
}
res.push_back(product);
}
return res;
}
int main(void) {
vector<int> primes {2, 3, 5};
vector<int> res = uniquePrimes(primes);
for(int i = 0; i< res.size(); ++i) cout << res[i] << " ";
cout << endl;
}