#include <algorithm>
#include <cmath>
#include <iostream>
#include <numeric>
#include <unordered_map>
#include <vector>
using
namespace
std;
bool
is_prime(
int
n)
{
if
(n < 2) {
return
false
;
}
for
(
int
i = 2; i <=
sqrt
(n); i++) {
if
(n % i == 0) {
return
false
;
}
}
return
true
;
}
tuple<
int
,
int
,
int
,
int
>
sum_and_product_of_k_primes(vector<
int
>& arr,
int
k)
{
unordered_map<
int
,
bool
> primes;
for
(
int
p : arr) {
if
(is_prime(p)) {
primes[p] =
true
;
}
}
vector<
int
> sorted_primes;
for
(
auto
it = primes.begin(); it != primes.end();
it++) {
sorted_primes.push_back(it->first);
}
sort(sorted_primes.begin(), sorted_primes.end());
vector<
int
> k_smallest_primes(
sorted_primes.begin(), sorted_primes.begin() + k);
sort(sorted_primes.rbegin(), sorted_primes.rend());
vector<
int
> k_largest_primes(sorted_primes.begin(),
sorted_primes.begin() + k);
int
sum_k_smallest
= accumulate(k_smallest_primes.begin(),
k_smallest_primes.end(), 0);
int
sum_k_largest
= accumulate(k_largest_primes.begin(),
k_largest_primes.end(), 0);
int
product_k_smallest = accumulate(
k_smallest_primes.begin(), k_smallest_primes.end(),
1, multiplies<
int
>());
int
product_k_largest = accumulate(
k_largest_primes.begin(), k_largest_primes.end(), 1,
multiplies<
int
>());
return
make_tuple(sum_k_smallest, sum_k_largest,
product_k_smallest,
product_k_largest);
}
int
main()
{
vector<
int
> arr = { 4, 2, 12, 13, 5, 19 };
int
k = 3;
auto
result = sum_and_product_of_k_primes(arr, k);
cout <<
"Sum of the k smallest primes: "
<< get<0>(result) << endl;
cout <<
"Sum of the k largest primes: "
<< get<1>(result) << endl;
cout <<
"Product of the k smallest primes: "
<< get<2>(result) << endl;
cout <<
"Product of the k largest primes: "
<< get<3>(result) << endl;
return
0;
}