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>
using namespace std;

const long long mod=1e9+7;

long long modpow(long long x, long long y){
	long long ret=1;
	while (y>0){
		if (y&1){
			ret*=x;
			ret%=mod;
		}
		x*=x;
		x%=mod;
		y>>=1;
	}
	return ret;
}

long long modinv(long long x){
	x%=mod;
	x+=mod;
	x%=mod;
	return modpow(x,mod-2);
}

int n, k, zero=0;
long long ans=1;
vector<long long>neg, pos;

int main(){
	cin >> n >> k;
	for (int i=0;i<n;i++){
		long long a;
		cin >> a;
		if (a<0) neg.push_back(a);
		else if (a>0) pos.push_back(a);
		else zero++;
	}
	if (n-zero<k){
		cout << 0 << "\n";
		return 0;
	}
	if (pos.size()==0 && k%2==1 && zero>0){
		cout << 0 << "\n";
		return 0;
	}
	if (n-zero==k){
		for (long long u : pos){
			ans*=u;
			ans%=mod;
		}
		for (long long u : neg){
			ans*=u;
			ans%=mod;
			ans+=mod;
			ans%=mod;
		}
		cout << ans << "\n";
		return 0;
	}
	k-=zero;
	if (pos.size()==0 && k%2==1){
		if (zero>0) ans=0;
		sort(neg.rbegin(),neg.rend());
		for (int i=0;i<k;i++){
			ans*=neg[i];
			ans%=mod;
			ans+=mod;
			ans%=mod;
		}
		cout << ans << "\n";
		return 0;
	}
	sort(pos.rbegin(),pos.rend());
	sort(neg.begin(),neg.end());
	int a=0, b=0;
	while (k>1){
		if (a+1<pos.size() && b+1<neg.size()){
			if (pos[a]*pos[a+1]>neg[b]*neg[b+1]){
				ans*=pos[a];
				ans%=mod;
				ans+=mod;
				ans%=mod;
				ans*=pos[a+1];
				ans%=mod;
				ans+=mod;
				ans%=mod;
				a+=2;
			}
			else{
				ans*=neg[b];
				ans%=mod;
				ans+=mod;
				ans%=mod;
				ans*=neg[b+1];
				ans%=mod;
				ans+=mod;
				ans%=mod;
				b+=2;
			}
		}
		else if (a+1<pos.size()){
			ans*=pos[a];
			ans%=mod;
			ans+=mod;
			ans%=mod;
			ans*=pos[a+1];
			ans%=mod;
			ans+=mod;
			ans%=mod;
			a+=2;
		}
		else if (b+1<neg.size()){
			ans*=neg[b];
			ans%=mod;
			ans+=mod;
			ans%=mod;
			ans*=neg[b+1];
			ans%=mod;
			ans+=mod;
			ans%=mod;
			b+=2;
		}
		k-=2;
//		cout << k << " ";
	}
	if (k==1){
		if (a<pos.size()){
			ans*=pos[a];
			ans%=mod;
		}
		else{
			if (a>0) ans*=modinv(pos[a-1]);
			else ans*=pos[a];
			ans%=mod;
			ans*=neg[b];
			ans%=mod;
			ans+=mod;
			ans%=mod;
			ans*=neg[b+1];
			ans%=mod;
			ans+=mod;
			ans%=mod;
		}
	}
	cout << ans << "\n";
}