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: Wrong Answer)

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <queue>
#include <cmath>
#include <climits>
#include <iomanip>
#include <set>
#include <map>
using namespace std;
typedef long long ll;
int main(){
  ll n,k;
  cin >> n >> k;
  vector<pair<ll,ll>> a(n);
  bool minus = true;
  for(int i = 0;i < n;i++){
    cin >> a[i].first;
    if(a[i].first < 0){
      a[i].second = -1;
      a[i].first *= -1;
    }
    else{
      minus = false;
      a[i].second = 1;
    }
  }
    ll mod = pow(10,9) + 7;
  sort(a.begin(),a.end());
  ll res = 0;
  res = 1;
  if(minus){
  for(int i = 0;i < k;i++){
    res *= a[i].first * -1;
    res %= mod;
    while(res < 0)res += mod;
    res %= mod;
  }
    cout << res << endl;
    return 0;
  }
  sort(a.rbegin(),a.rend());
  ll now = 1;
  for(int i = 0;i < k;i++){
    now *= a[i].second;
  }
  if(now == 1){
    for(int i = 0;i < k;i++){
      res *= a[i].first;
      res %= mod;
    }
    cout << res << endl;
  }
  else{
    double case1 = 0;
    for(int i = k;i < n;i++){
      if(a[i].second == 1){
        case1 = a[i].first;
        break;
      }
    }
    for(int j = k - 1;j >= 0;j--){
      if(a[j].second == -1){
        case1 /= a[j].first;
        break;
      }
    }
    double case2 = 0;
    for(int i = k;i < n;i++){
      if(a[i].second == -1){
        case2 = a[i].first;
        break;
      }
    }
    for(int j = k - 1;j >= 0;j--){
      if(a[j].second == 1){
        case2 /= a[j].first;
        break;
      }
    }
    double casefin = max(case1,case2);
    for(int i = 0;i < k;i++){
      res *= a[i].first;
      res %= mod;
    }
    res *= casefin;
    res %= mod;
    cout << res << endl;
  }
}