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: Wrong Answer)

N,K=map(int,input().split())
A=list(map(int,input().split()))
mod=10**9+7

if N==K:
    ans=1
    for i in range(N):
        ans=(ans*A[i])%mod
    print(ans%mod)
else:
    neg=[]
    posi=[]
    zero=0
    for i in range(N):
        if A[i]>0:
            posi.append(A[i])
        elif A[i]<0:
            neg.append(-A[i])
        else:
            zero+=1
    if K>N-zero:
        print(0)
    elif len(neg)==N and K%2==1:
        neg.sort()
        ans=1
        for i in range(K):
            ans=(-ans*neg[i])%mod
        print(ans%mod)
    else:
        A.sort(key=lambda x:-abs(x))
        temp=A[:K]
        rest=A[K:]
        check=0
        for i in range(K):
            if temp[i]<0:
                check+=1
        if check%2==0:
            ans=1
            for i in range(K):
                ans=(ans*abs(temp[i]))%mod
            print(ans%mod)
        else:
            if check!=K and check!=0:
                rest.sort()
                temp.sort()
                #neg->posi
                val1=-1
                val2=-1
                for i in range(K-1):
                    if temp[i]<0 and temp[i+1]>0:
                        val1=temp[i]
                        val2=temp[i+1]
                        break
                #(abs(val1),rest[-1])
                #posi->neg
                #(abs(val2),abs(rest[0]))
                if rest[-1]>=0 and rest[0]<0:
                    if abs(rest[-1])*abs(val2)>abs(rest[0])*abs(val1):
                        ans=1
                        for i in range(K):
                            ans=(ans*abs(temp[i]))%mod
                        ans=(ans*abs(rest[-1]))%mod
                        ans=(ans*pow(abs(val1),mod-2,mod))%mod
                        print(ans%mod)
                    else:
                        ans=1
                        for i in range(K):
                            ans=(ans*abs(temp[i]))%mod
                        ans=(ans*abs(rest[0]))%mod
                        ans=(ans*pow(abs(val2),mod-2,mod))%mod
                        print(ans%mod)
                elif rest[-1]<0:
                    ans=1
                    for i in range(K):
                        ans=(ans*abs(temp[i]))%mod
                    ans=(ans*abs(rest[0]))%mod
                    ans=(ans*pow(abs(val2),mod-2,mod))%mod
                    print(ans%mod)
                else:
                    ans=1
                    for i in range(K):
                        ans=(ans*abs(temp[i]))%mod
                    ans=(ans*abs(rest[-1]))%mod
                    ans=(ans*pow(abs(val1),mod-2,mod))%mod
                    print(ans%mod)
            elif check==K:
                val1=abs(temp[-1])
                ans=1
                for i in range(K):
                    ans=(ans*abs(temp[i]))%mod
                ans=(ans*abs(rest[-1]))%mod
                ans=(ans*pow(abs(val1),mod-2,mod))%mod
                print(ans%mod)
            else:
                val2=abs(temp[0])
                ans=1
                for i in range(K):
                    ans=(ans*abs(temp[i]))%mod
                ans=(ans*abs(rest[0]))%mod
                ans=(ans*pow(abs(val2),mod-2,mod))%mod
                print(ans%mod)