let split_string ?(pattern="") = Str.split @@ Str.regexp pattern
let n, k = Scanf.sscanf (read_line ()) "%d %d" @@ fun n k -> (n, k)
let a = read_line () |> split_string ~pattern:" " |> List.map int_of_string

let m_1e9 = int_of_float 1e9 + 7
let ( +^ ) x y = (x + y) mod m_1e9
let ( -^ ) x y = x - y + if x < y then m_1e9 else 0
let ( *^ ) x y = ((x mod m_1e9) * (y mod m_1e9)) mod m_1e9

let rec take res n acc = match (n, acc) with
  | (_, []) | (0, _) -> List.rev res
  | (i, x :: xs) -> take (x :: res) (n - 1) xs
let take = take []

let rec split a b = function
  | [] -> (List.sort compare a |> List.rev, List.sort compare b)
  | x :: rest when x > 0 -> split (x :: a) b rest
  | x :: rest -> split a (x :: b) rest
let plus, minus = split [] [] a

let solve1 () = 
  let rec f sum n plus minus = match (n, plus, minus) with
    | 0, _, _ -> sum
    | 1, p :: _, _ -> sum *^ p
    | i, ((p1 :: p2 :: px) as ppx), ((m1 :: m2 :: mx) as mmx) ->
        if p1 * p2 > m1 * m2 then
          f (sum *^ p1 *^ p2) (i - 2) px mmx
        else
          f (sum *^ m1 *^ m2) (i - 2) ppx mx
    | i, (p1 :: p2 :: px), mx -> f (sum *^ p1 *^ p2) (i - 2) px mx
    | i, px, (m1 :: m2 :: mx) -> f (sum *^ m1 *^ m2) (i - 2) px mx
    | _ -> failwith "" in
  f 1 k plus minus

let solve2 () =
  let a = List.sort (fun a b -> abs a - abs b) a in
  List.fold_left ( *^ ) 1 @@ take k a

let f n = (n + m_1e9) mod m_1e9
  
let () =
  let p_len = List.length plus in
  Printf.printf "%d\n" @@ f @@
  if p_len >= k || (k - p_len) mod 2 = 0 then solve1 () else solve2 ()