-- https://atcoder.jp/contests/abc173/tasks/abc173_e
-- 正の値になりうるかチェック
-- 正の値になりうるときは、絶対値で降順ソートしたうえで先頭から (k-1) 個とり、残りは積が正の値になる値を加える
-- 正の値にならないときは、絶対値で昇順ソートした上で先頭から k 個とる

import Data.List
import Data.Ord
import Data.Maybe
import Control.Applicative

calcPositive :: Integral a => Int -> [a] -> Maybe [a]
calcPositive k vs = let (xs, ys) = splitAt (k-1) vs
                        cmp = if product xs >= 0 then (>= 0) else (< 0)
                    in (:xs) <$> find cmp ys

main :: IO ()
main = do
  [_, k] <- map read . words <$> getLine :: IO [Int]
  vs <- map read . words <$> getLine :: IO [Integer]
  let sorted = sortOn (Down . abs) vs
      m = floor $ 10 ** 9 + 7
      vs' = fromMaybe (take k $ reverse sorted) $ calcPositive k sorted
  print . (`mod` m) $ product vs'
