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 <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <stdbool.h>
typedef long long LL;
typedef long double Lf;
#define Rep(i,a,n)for(int i=(int)(a);i<(int)(n);i++)
#define rep(i,n)Rep(i,0,n)
#define Ma(x,y) ((x)>(y)?(x):(y))
#define mi(x,y) ((x)<(y)?(x):(y))
#define MOD 1000000007
int acs(const void* a, const void* b) { return *(int*)a - *(int*)b; } // 1,2,3,4
int des(const void* a, const void* b) { return *(int*)b - *(int*)a; } // 8,7,6,5
int cmp_char(const void* a, const void* b) { return *(char*)a - *(char*)b; } // a,b,c,d
int cmp_str(const void* a, const void* b) { return strcmp(*(const char**)a, *(const char**)b); } // aaa,aab
//snippet
#define N 200009

int main() {
	LL n, k, p[N], m[N], pl = 0, mn = 0, zr = 0, ans = 0, t;
	scanf("%lld%lld", &n, &k);
	rep(i, n) {
		scanf("%lld", &t);
		if (!t)zr++;
		else if (t > 0)p[pl++] = t;
		else m[mn++] = -t;
	}
	qsort(p, pl, sizeof(LL), des);
	qsort(m, mn, sizeof(LL), des);


	if (k - pl - mn < 0)ans = 0;
	else if (n == k && mn % 2) {//-
		if (zr)ans = 0;
		else {
			rep(i, pl) {
				if (!i)ans = p[i];
				else ans *= p[i];
				ans %= MOD;
			}
			rep(i, mn) {
				ans *= m[i];
				ans %= MOD;
			}
			ans = MOD - ans;
		}
	}
	else if (!pl && k%2) {//-
		if (zr)ans = 0;
		else {
			rep(i, k) {
				if (!i)ans = m[mn - 1 - i];
				else ans *= m[mn - 1 - i];
				ans %= MOD;
			}
			ans = MOD - ans;
		}
	}
	else {//+(mn 偶数使う)
		Lf pa[N], ma[N];
		rep(i, pl)pa[i] = log10l((Lf)p[i]);
		rep(i, mn)ma[i] = log10l((Lf)m[i]);
		Lf tp = 0;
		if (k <= pl) {
			rep(i, k)tp += pa[i];
		}
		else {
			rep(i, pl)tp += pa[i];
			rep(i, k - pl)tp += ma[i];
		}
		Lf mx = tp;
		int X = 0;
		for (int x = 0; x <= k && x < mn; x += 2) {
			rep(i, x)tp -= pa[i];
			rep(i, x) {
				if (k <= pl)tp += ma[i];
				else tp += ma[i + k - pl];
			}
			if (mx < tp) {
				X = x;
				mx = tp;
			}
		}
		ans = 1;
		rep(i, X) {
			ans *= m[i];
			ans %= MOD;
		}
		rep(i, k - X) {
			ans *= p[i];
			ans %= MOD;
		}
	}


	printf("%lld", ans);
	return 0;
}