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 Python (3.8.2) (judge verdict: Runtime Error)

from copy import deepcopy
import sys

input = sys.stdin.buffer.readline
N, K = map(int, input().split())
A = sorted(list(map(int, input().split())), key=lambda x: abs(x), reverse=True)
MOD = 10**9 + 7

# print(f'{A=}')

if N == K:
    ans = 1
    for a in A:
        ans *= a
        ans %= MOD
    print(ans)
    exit()

if K % 2 == 1:
    if max(A) < 0:
        ans = 1
        for a in A[::-1][:K]:
            ans *= a
            ans %= MOD
        print(ans)
        exit()

P = 1
for a in A[:K]:
    if a >= 0:
        P *= 1
    else:
        P *= -1
# print(f'{P=}')

if P > 0:
    ans = 1
    for a in A[:K]:
        ans *= a
        ans %= MOD
    print(ans)
    exit()

# print(f'{A[K:]=}')

# (1) 負の数を 1 つ取り除き、非負の数を 1 つ加える
patern_one = True
plus1, minus1 = 0, 0
for plus1 in A[K:]:
    if plus1 >= 0:
        break
else:
    patern_one = False
for minus1 in A[:K][::-1]:
    if minus1 < 0:
        break
else:
    patern_one = False
# print(f'{plus1=}, {minus1=}, {patern_one=}')

# (2) 正の数を 1 つ取り除き、負の数を 1 つ加える
patern_two = True
plus2, minus2 = 0, 0
for plus2 in A[:K][::-1]:
    if plus2 >= 0:
        break
else:
    patern_two = False
for minus2 in A[K:]:
    if minus2 < 0:
        break
else:
    patern_two = False
# print(f'{plus2=}, {minus2=}, {patern_two=}')


def f1():
    subset = deepcopy(A[:K])
    subset.remove(minus1)
    subset.append(plus1)
    # print(f'{subset=}')
    ans = 1
    for s in subset:
        ans *= s
        ans %= MOD
    return ans


def f2():
    subset = deepcopy(A[:K])
    subset.remove(plus2)
    subset.append(minus2)
    # print(f'{subset=}')
    ans = 1
    for s in subset:
        ans *= s
        ans %= MOD
    return ans


if patern_one and patern_two:
    # print(f'plus2 * minus1={plus2 * minus1}')
    # print(f'plus1 * minus2={plus1 * minus2}')
    if abs(plus2 * minus1) <= abs(plus1 * minus2):
        # (1)
        ans = f1()
        # ans2 = f2()
    else:
        # (2)
        ans2 = f1()
        # ans = f2()
elif patern_one:
    ans = f1()
else:
    ans = f2()
print(ans)
# print(ans, ans2)