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>
#define REP(i,n) for(int i=0;i<(n);++i)
#define ALL(v)   (v).begin(),(v).end()
#define debug(x) cerr<<#x<<": "<<(x)<<endl
#define INF      (int)1e9
#define EPS      (double)1e-9
#define MOD      ((int)1e9+7)
using namespace std;
typedef long long     llong;
typedef vector<int>   vi;
typedef vector<vi >   vvi;
typedef vector<vvi >  vvvi;
typedef pair<int,int> pii;
template<class Type> void line(const Type &a){int cnt=0;for(const auto &elem:a){if(cnt++)cerr<<' ';cout<<elem;}cerr<<endl;}

template<class Type_k,class Type_p>
Type_p mod_pow(long long n,Type_k k,Type_p p){//n^k(mod p).
	if(k==0) return 1;
	long long res=mod_pow(n*n%p,k/2,p);
	if(k&1) res=res*n%p;
	return res;
}

int main(){
	const llong inf=1e18;
	
	int n,k;
	cin>>n>>k;
	
	vi a(n);
	int num=0;//負の数.
	REP(i,n){
		cin>>a[i];
		if(a[i]<0) num++;
	}
	
	if(k==n){//全部選ぶ場合.
		llong ans=1;
		REP(i,n) ans=ans*(MOD+a[i])%MOD;
		cout<<ans<<endl;
		return 0;
	}
	
	if(num==n and k%2){//ansが負になる場合.
		llong ans=1;
		sort(ALL(a),greater<int>());
		REP(i,k) ans=ans*(MOD+a[i])%MOD;
		cout<<ans<<endl;
		return 0;
	}
	
	llong ans=1;
	int cnt=0;
	auto f=[](int x,int y){
		return abs(x)>abs(y);//絶対値が大きい順にソート.
	};	
	sort(ALL(a),f);
	REP(i,k){
		ans=ans*(MOD+a[i])%MOD;
		if(a[i]<0) cnt++;
	}
	
	if(cnt%2==0){//非負ならok.
		cout<<ans<<endl;
		return 0;
	}
	
	llong pl,pr,ml,mr;
	pl=pr=ml=mr=inf;
	REP(i,k){
		if(a[i]<0) ml=a[i];
		else pl=a[i];
	}
	for(int i=n-1;i>=k;--i){
		if(a[i]<0) mr=a[i];
		else pr=a[i];
	}
	
	//「非負の数割って負の数かける」,または「負の数割って非負の数かける」.
	if(pl==inf or mr==inf) ans=ans*mod_pow(MOD+ml,MOD+2,MOD)%MOD*pr%MOD;
	else if(ml==inf or pr==inf) ans=ans*mod_pow(pl,MOD+2,MOD)%MOD*(MOD+mr)%MOD;
	else{
		if(ml*mr<pl*pr) ans=ans*mod_pow(MOD+ml,MOD+2,MOD)%MOD*pr%MOD;
		else ans=ans*mod_pow(pl,MOD+2,MOD)%MOD*(MOD+mr)%MOD;
	}
	
	cout<<ans<<endl;
}