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 PyPy3 (7.3.0) (judge verdict: Runtime Error)

N,K = map(int,input().split())
A = list(map(int,input().split()))
mod = 10**9+7
P = []
M = []
zero = []
for a in A:
    if a>0:
        P.append(a)
    elif a<0:
        M.append(a)
    else:
        zero.append(a)
if N==K and zero: print(0);exit()
if len(P)==0:
    if K%2==0:
        ans = 1
        if len(M)>=K:
            M.sort(reverse=True)
            for i in range(K):
                ans *=M[i]
                ans %=mod
            print(ans);exit()
        else: print(0);exit()
    else:
        ans = 1
        if len(M)>=K:
            M.sort()
            for i in range(K):
                ans *=M[i]
                ans %=mod
            print(ans);exit()
        else: print(0);exit()
P.sort(reverse=True)
M.sort(reverse=True)
if K==1:
    A.sort()
    print(A[-1]);exit()
if len(P)>=K:
    ans = 1
    P = P[:K]
    for i in range(K):
        ans *=P[i]
        ans %=mod
    while P:
        while len(M)>=2:
            a1 = M.pop()
            a2 = M.pop()
            b1 = P.pop()
            b2 = P.pop()
            if a1*a2 > b1*b2:
                ans = ans/b1
                ans = ans/b2
                ans *=a1*a2
                ans %=mod
            else:
                break
        break
else:
    ans = 1
    
    K -=len(P)
    if K>len(M):print(0);exit()
    else:
        if K%2!=0:
            if zero:print(0);exit()
            else:
                for i in range(len(P)-1):
                    ans *=P[i]
                    ans %=mod
                if K+1<=len(M):
                    while P:
                        while len(M)>=2:
                            a1 = M.pop()
                            a2 = M.pop()
                            b1 = P.pop()
                            b2 = P.pop()
                            if a1*a2 > b1*b2:
                                ans = ans/b1
                                ans = ans/b2
                                ans *=a1*a2
                                ans %=mod
                            else:
                                break
                        break
                else:
                    print(0);exit()
        else:
            for i in range(len(P)):
                ans *=P[i]
                ans %=mod
            if K<=len(M):
                while P:
                    while len(M)>=2:
                        a1 = M.pop()
                        a2 = M.pop()
                        b1 = P.pop()
                        b2 = P.pop()
                        if a1*a2 > b1*b2:
                            ans = ans/b1
                            ans = ans/b2
                            ans *=a1*a2
                            ans %=mod
                        else:
                            break
                    break
            else:
                print(0);exit()
print(int(ans%mod))