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 rec two res = function
  | [] -> (res, None)
  | x :: [] -> (res, Some x)
  | x :: y :: rest -> two ((x * y) :: res) rest

let solve1 () = 
  let (ps, p) = two [] plus in
  let (ms, m) = two [] minus in
  let acc = (ps @ ms) |> List.sort compare |> List.rev in
  let f = function None -> 1 | Some n -> n in
  let sum = List.fold_left ( *^ ) 1 @@ take (k / 2) acc in
  sum *^ if k mod 2 = 1 then f p else 1

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 ()