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 C# (.NET Core 3.1.201) (judge verdict: Runtime Error)

using System.Linq;
using System.Collections.Generic;
using System;

public class Hello
{
    public static int MOD = 1000000007;
    public static void Main()
    {
        string[] line = Console.ReadLine().Trim().Split(' ');
        var n = int.Parse(line[0]);
        var k = int.Parse(line[1]);
        line = Console.ReadLine().Trim().Split(' ');
        var ap = new List<int>();
        var am = new List<int>();
        for (int i = 0; i < n; i++)
        {
            var w = int.Parse(line[i]);
            if (w >= 0) ap.Add(w);
            else am.Add(-w);
        }
        var apc = ap.Count();
        var amc = am.Count();
        var c = checkPlus(n, k, apc, amc);
        if (c) calcPlus(k, ap, am);
        else calcMinus(k, am);
    }
    static void calcPlus(int k, List<int> ap, List<int> am)
    {
        ap.Sort(); am.Sort();
        ap.Reverse(); am.Reverse();
        if (k == 1) { Console.WriteLine(ap[0]); return; }
        var pair = new List<long>();
        var p = k % 2 == 1 ? 1 : 0;
        while (p + 1 < ap.Count())
        {
            pair.Add((long)ap[p] * ap[p + 1]);
            p += 2;
        }
        p = 0;
        while (p + 1 < am.Count())
        {
            pair.Add((long)am[p] * am[p + 1]);
            p += 2;
        }
        pair.Sort(); pair.Reverse();
        long ans = k % 2 == 1 ? ap[0] : 1L;
        for (int i = 0; i < k / 2; i++)
        {
            var pp = pair[i] % MOD;
            ans *= pp;
            ans %= MOD;
        }
        if (ans < 0) ans += MOD;
        Console.WriteLine(ans);
    }
    static void calcMinus(int k, List<int> am)
    {
        am.Sort();
        var ans = 1L;
        for (int i = 0; i < k; i++)
        {
            ans *= -am[i];
            ans %= MOD;
        }
        if (ans < 0) ans += MOD;
        Console.WriteLine(ans);
    }
    static bool checkPlus(int n, int k, int apc, int amc)
    {
        if (apc > 0)
        {
            if (n == k) return amc % 2 == 0;
            else return true;
        }
        else return k % 2 == 0;
    }
}