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 PHP (7.4.4) (judge verdict: Accepted)

<?php

[$N, $K] = fscanf(STDIN, "%d%d");
const MOD = 1000000007;
$list = fscanf(STDIN, str_repeat("%d", $N));

$zero = 0;
$neg = [];
$pos = [];
foreach($list as $value){
    if($value < 0){
        $neg[] = $value;
    }elseif($value > 0){
        $pos[] = $value;
    }else{
        $zero++;
    }
}
$count_neg = count($neg);
$count_pos = count($pos);
sort($neg);
rsort($pos);
if($count_neg + $count_pos < $K){
    echo 0;
    exit;
}
$ans = 1;
if($count_pos === 0){
    if($K % 2 === 1){
        if($zero > 0){
            echo 0;
            exit;
        }
        for($i=$count_neg-1;$i>=($count_neg-$K);$i--){
            $ans *= $neg[$i];
            $ans %= MOD;
        }
    }else{
        for($i=0;$i<$K;$i++){
            $ans *= $neg[$i];
            $ans %= MOD;
        }
    }
}else{
    $neg_now = 0;
    $pos_now = 0;

    while($K > $pos){
        $ans *= $neg[$neg_now];
        $ans %= MOD;
        $neg_now++;
        $ans *= $neg[$neg_now];
        $ans %= MOD;
        $neg_now++;
        $K-=2;
    }
    while($K>0){
        if($K > 1 && isset($neg[$neg_now+1])){

            $tmp_neg = $neg[$neg_now] * $neg[$neg_now+1];
            if(isset($pos[$pos_now + 1])){
                $tmp_pos = $pos[$pos_now] * $pos[$pos_now + 1];
            }else{
                $tmp_pos = 0;
            }

            if($tmp_neg > $tmp_pos){

                $ans *= $neg[$neg_now];
                $ans %= MOD;
                $neg_now++;
                $ans *= $neg[$neg_now];
                $ans %= MOD;
                $neg_now++;
                $K-=2;
            }else{

                $ans *= $pos[$pos_now];
                $ans %= MOD;
                $pos_now++;
                $K--;
            }
        }else{
            if(isset($pos[$pos_now])){
                $ans *= $pos[$pos_now];
                $ans %= MOD;
                $pos_now++;
                $K--;
            }else{
                $ans *= $neg[$neg_now];
                $ans %= MOD;
                $neg_now++;
                $K--;
            }


        }


    }



}
if($ans >= MOD){
    $ans %= MOD;
}elseif($ans < 0){
    if($zero > 0){
        echo 0;
        exit;
    }
    while($ans < 0){
        $ans += MOD;
    }

}
echo $ans;