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 Julia (1.4.0) (judge verdict: Accepted)

using DataStructures
const double = Float64
const int = Int64

parseint(x) = parse(int, x)
readint() = map(parseint, split(readline()))

const MOD = 10^9+7
function main()
  N,K = readint()
  A = readint()
  sort!(A)
  
  # 負, 0, 正の区間 
  # searchsorted が基本ですね
  L0 = searchsorted(A,0)
  Lm = 1:(L0.start-1)
  Lp = (L0.stop + 1):N
  
  # 負、0, 正の数
  Nm = length(Lm)
  N0 = length(L0)
  Np = length(Lp)

  if N0 > N-K
    println(0)
    return
  end

  if K == N
    s = 1
    for a in A
      s *= a
      s %= MOD
    end
    if s < 0
      s += MOD
    end
    println(s)
    return
  end

  
  if L0.stop == N
    s = 1
    if K%2 == 1 
      for i in N:-1:N-K+1
        s *= A[i]
        s %= MOD

      end
      if s < 0
        s += MOD
      end 
    else
      for i in 1:K
        s *= A[i]
        s %= MOD
      end
    end
    
  else
    s = 1
    if K%2 == 1
      s *= A[end]
    end
    B = Vector{int}(undef,N)
    B .= 0
    

    Nm = L0.stop
    NPm = Nm÷2 
    for i in 1:NPm
      B[i] = A[2i-1]*A[2i]
    end
    
    p = NPm + 1
    if K%2==1
      for i in N-1:-2:Nm+2
        B[p] = A[i]*A[i-1]
        p += 1
      end
    else
      for i in N:-2:Nm+2
        B[p] = A[i]*A[i-1]
        p += 1
      end
    end
      
    sort!(B,rev=true)
    #println(B)
    for i in 1:K÷2
      s *= B[i]%MOD
      s %= MOD
    end    

  end
  println(s)

  


end

main()