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++ (Clang 10.0.0) (judge verdict: Wrong Answer)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <complex>
#include <cmath>
#include <vector>
#include <map>
#include <set>
#include <stack> 
#include <bitset>
#include <queue>
#include <assert.h>
#include <unordered_map>
using namespace std;

const int mod = 1000000007;
const int N = 200010;
vector<int> v[2];

bool cmp(int x, int y) {
	return x > y;
}

double sum[2][N];

int main()
{
	int n, m;
	scanf("%d%d", &n, &m);
	int zeros = 0;
	for (int i = 0; i < n; i++) {
		int x;
		scanf("%d", &x);
		if (x < 0) v[0].push_back(-x);
		else if (x > 0) v[1].push_back(x);
		else zeros++;
	}

	sort(v[0].begin(), v[0].end(), cmp);
	sort(v[1].begin(), v[1].end(), cmp);

	for (int i = 0; i < 2; i++) {
		for (int j = 1; j <= v[i].size(); j++)
			sum[i][j] = sum[i][j - 1] + log(v[i][j - 1] * 1.0);
	}

	bool flag = false;

	double mx = -1e30;
	int x = -1, y = -1;
	for (int i = 0; i <= v[0].size() && i <= m; i += 2) {
		int j = m - i;
		if (j > v[1].size()) continue;
		if (mx < sum[0][i] + sum[1][j]) {
			mx = sum[0][i] + sum[1][j];
			x = i, y = j;
			flag = true;
		}
	}

	if (flag) {
		int ans = 1;
		for (int i = 0; i < x; i++)
			ans = 1LL * ans * v[0][i] % mod;
		for (int i = 0; i < y; i++)
			ans = 1LL * ans * v[1][i] % mod;
		printf("%d\n", ans);
		return 0;
	}

	if (!flag) {
		if (zeros) {
			printf("0\n");
			return 0;
		}
	}

	memset(sum, 0, sizeof(sum));
	sort(v[0].begin(), v[0].end());
	sort(v[1].begin(), v[1].end());

	mx = 1e30;
	x = -1, y = -1;
	for (int i = 0; i < 2; i++) {
		for (int j = 1; j <= v[i].size(); j++)
			sum[i][j] = sum[i][j - 1] + log(v[i][j - 1] * 1.0);
	}

	for (int i = 0; i <= v[0].size() && i <= m; i ++) {
		int j = m - i;
		if (j > v[1].size()) continue;
		if (mx > sum[0][i] + sum[1][j]) {
			mx = sum[0][i] + sum[1][j];
			x = i, y = j;
		}
	}


	int ans = 1;
	for (int i = 0; i < x; i++)
		ans = 1LL * ans * v[0][i] % mod;
	for (int i = 0; i < y; i++)
		ans = 1LL * ans * v[1][i] % mod;
	ans = mod - ans;
	printf("%d\n", ans);
	return 0;
}