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<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp> 
using namespace __gnu_pbds; 
using namespace std;
 
#define ff              first
#define ss              second
#define int             long long
#define pb              push_back
#define mp              make_pair
#define pii             pair<int,int>
#define vi              vector<int>
#define mii             map<int,int>
#define pqb             priority_queue<int>
#define pqs             priority_queue<int,vi,greater<int> >
#define MX              200005
#define mod             1000000007
#define inf             1e18
#define ps(x,y)         fixed<<setprecision(y)<<x
#define mk(arr,n,type)  type *arr=new type[n];
#define w(x)            int x; cin>>x; while(x--)
#define pw(b,p)         pow(b,p) + 0.1
mt19937                 rng(chrono::steady_clock::now().time_since_epoch().count());
 
typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> pbds;
 
void codeforces()
{
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    #ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    #endif
}
int a[200005];
bool compare(int a, int b)
{
    if( abs(a) > abs(b)) return true;
    else return !true;
}
int modinv(int a,int n = mod - 2){
  if(!n)
    return 1;
  int p = modinv(a,n/2);
  p = (p*p)%mod;
  if(n&1)
    return (p*a)%mod;
  return p;
}
int32_t main()
{
    int n, k;
    cin>>n>>k;
    int flag = 0;
    for(int i=0; i<n; i++){ 
        cin>>a[i];
        if( a[i] > 0) flag = 1;
    }
    if( k == n){
        int ans = 1;
        for(int i=0; i<k; i++){ 
            ans*=a[i];
            ans = (ans%mod + mod)%mod;
        }
        cout<<(mod + ans)%mod;
        return 0;
    }
    if(flag == 0 and k%2 == 1){
        sort(a, a+n, greater<int>());
        int ans = 1;
        for(int i=0; i<k; i++){ 
            ans*=a[i];
            ans = (ans%mod + mod)%mod;
        }
        cout<<(mod + ans)%mod<<endl;
        return 0;
    }
    sort(a, a+n, compare);
    int ans = 1;
    int sign = 0;
    for(int i=0; i<k; i++){
        ans = ans*a[i];
        if( a[i] < 0) sign++;
        ans = (ans%mod + mod)%mod;
    }
    if( sign%2 == 0) cout<<(ans+mod)%mod;
    else{
        set<int> s1, s2;
        // int x = 0, y = 0;
        for(int i=k; i<n; i++){
            if( a[i] < 0) s1.insert(a[i]);
            else s2.insert(a[i]);
        }
        int x = *(s1.end()--);
        int y = *(s2.end()--);
        s1.clear();
        s2.clear();
        for(int i=0; i<k; i++){
            if( a[i] < 0) s1.insert(a[i]);
            else s2.insert(a[i]);
        }
        int t1 = *(s1.begin());
        int t2 = *(s2.begin());
        int maxi;
        maxi = max( ((ans*x) * modinv(t1))%mod, ((ans*y) * modinv(t2) )%mod);
        // int maxi = 0;
        // for(int i=0; i<k; i++){
        //     if( a[i] < 0){
        //         maxi = max(maxi, ( ( (ans*y + mod)%mod * modinv(a[i]%mod) )%mod + mod)%mod);
        //     }
        //     else 
        //         maxi = max(maxi, ( ( (ans*x + mod)%mod * modinv(a[i]%mod) )%mod + mod)%mod);
        // }
        cout<<(mod + maxi)%mod<<endl;
    }
    return 0;
}