Problem:
Score : 500 points

Problem Statement

Given are N integers A_1,\ldots,A_N.

We will choose exactly K of these elements. Find the maximum possible product of the chosen elements.

Then, print the maximum product modulo (10^9+7), using an integer between 0 and 10^9+6 (inclusive).

Constraints

1 \leq K \leq N \leq 2\times 10^5

|A_i| \leq 10^9

Input

Input is given from Standard Input in the following format:

N K
A_1 \ldots A_N

Output

Print the maximum product modulo (10^9+7), using an integer between 0 and 10^9+6 (inclusive).

Sample Input 1

4 2
1 2 -3 -4

Sample Output 1

12

The possible products of the two chosen elements are 2, -3, -4, -6, -8, and 12, so the maximum product is 12.

Sample Input 2

4 3
-1 -2 -3 -4

Sample Output 2

1000000001

The possible products of the three chosen elements are -24, -12, -8, and -6, so the maximum product is -6.

We print this value modulo (10^9+7), that is, 1000000001.

Sample Input 3

2 1
-1 1000000000

Sample Output 3

1000000000

The possible products of the one chosen element are -1 and 1000000000, so the maximum product is 1000000000.

Sample Input 4

10 10
1000000000 100000000 10000000 1000000 100000 10000 1000 100 10 1

Sample Output 4

999983200

Be sure to print the product modulo (10^9+7).

Solution in C++ (GCC 9.2.1) (judge verdict: Accepted)

#include<bits/stdc++.h>

using namespace std;

typedef long long int ll;

const int mod = 1e9 + 7;

int main () {
  ios_base::sync_with_stdio(false);
  cin.tie(0);cout.tie(0);

  int n, k;
  cin >> n >> k;
  vector < pair < int, int > > v;
  bool ok = false;
  int cnt_zero = 0;
  for (int i = 0; i < n; i++) {
    int a; cin >> a;
    ok |= (a > 0);
    if (a > 0) v.push_back({a, 1});
    else if (a < 0) v.push_back({-a, -1});
    else cnt_zero++;
  }

  if (n - cnt_zero < k) {
    cout << 0 << '\n';
    return 0;
  }

  sort (v.begin(), v.end(), greater < pair < int, int > > ());

  int cnt = 0;
  for (int i = 0; i < k; i++) {
    cnt += (v[i].second == -1);
  }

  if (!ok && k & 1) {
    // number is -ve.
    if (cnt_zero) cout << 0 << '\n';
    else {
      reverse (v.begin(), v.end());
      ll ans = 1;
      for (int i = 0; i < k; i++) ans = (ans * v[i].first) % mod;
      ans = mod - ans;

      cout << ans << '\n';
    }
  } else {
    // number is +ve.
    if (cnt & 1) {
      int idx_last_neg = -1, idx_last_pos = -1;
      for (int i = 0; i < k; i++) {
        if (v[i].second == 1) idx_last_pos = i;
        else idx_last_neg = i;
      }

      if (idx_last_pos == -1) {
        // k is odd, and +ve number is ahead.
        for (int i = k; i < n; i++) {
          if (v[i].second == 1) {
            swap (v[i], v[idx_last_neg]);
            ok = false;
            break;
          }
        }
      } else if (k == n) {
        ll ans = 1;
        for (int i = 0; i < k; i++) ans = (ans * v[i].first) % mod;
        ans = mod - ans;
        cout << ans << '\n';
        return 0;
      } else {
        int i = -1, j = -1;
        for (int p = k; p < n; p++) {
          if (v[p].second == -1 && j == -1) j = p;
          if (v[p].second == 1 && i == -1) i = p;
        }

        if (i == -1) swap (v[j], v[idx_last_pos]);
        else if (j == -1) swap (v[i], v[idx_last_neg]);
        else {
          if ((ll)v[i].first * v[idx_last_pos].first > (ll)v[j].first * v[idx_last_neg].first) swap (v[i], v[idx_last_neg]);
          else swap (v[j], v[idx_last_pos]);
        }
      }
    }

    ll ans = 1;
    for (int i = 0; i < k; i++) ans = (ans * v[i].first) % mod;
    cout << ans << '\n';
  }
}