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;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace E
{
    class Program
    {
        static void Main(string[] args)
        {
            string line = Console.ReadLine();
            string[] strs = line.Split(' ');

            int N = int.Parse(strs[0]);
            int K = int.Parse(strs[1]);
            List<int> A = new List<int>();

            line = Console.ReadLine();
            strs = line.Split(' ');
            for(int i = 0; i < N; i++)
            {
                A.Add(int.Parse(strs[i]));
            }
            int[] ArrayA = A.OrderByDescending(x => Math.Abs(x)).ToArray();
           

            bool minus = false;
            bool no_plus = true;
            for(int i = 0; i < K; i++)
            {
                if (ArrayA[i] < 0) minus = !minus;
                if (ArrayA[i] > 0) no_plus = false;
            }
            if (minus)
            {
                if (no_plus)
                {
                    // パターン1:プラスがないので、できるだけ小さい値(つまり素直に大きい順)を採用する
                    ArrayA = A.OrderByDescending(x => x).ToArray();
                    long sum = Math.Abs(ArrayA[0]);
                    for (int i = 1; i < K; i++)
                    {
                        sum *= Math.Abs(ArrayA[i]);
                        sum %= 1000000007;
                    }
                    Console.WriteLine((-1)* sum + 1000000007);
                }
                else
                {
                    int kubi = -1;
                    int saiyou = -1;
                    // パターン2:一番小さいマイナスをクビにして、一番大きいプラス(>0)を採用する
                    for(int i = K-1; i >= 0; i--)
                    {
                        if (ArrayA[i] < 0)
                        {
                            kubi = i;
                            break;
                        }
                    }
                    for (int i = K; i < N; i++)
                    {
                        if (ArrayA[i] > 0)
                        {
                            saiyou = i;
                            break;
                        }
                    }
                    long sum = 1;
                    for (int i = 0; i < K; i++)
                    {
                        if (i == kubi) continue;
                        sum *= Math.Abs(ArrayA[i]);
                        sum %= 1000000007;
                    }
                    sum *= Math.Abs(ArrayA[saiyou]);
                    sum %= 1000000007;
                    Console.WriteLine(sum);
                }
            }
            else
            {
                long sum = Math.Abs(ArrayA[0]);
                for (int i = 1; i < K; i++)
                {
                    sum *= Math.Abs(ArrayA[i]);
                    sum %= 1000000007;
                }
                Console.WriteLine(sum);
            }
        }
    }
}