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++ (GCC 9.2.1) (judge verdict: Wrong Answer)

//#include<bits/stdc++.h>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<stdlib.h>
#include<queue>
#include<map>
#include<vector>
#include<cmath>
#include<fstream>
#include <set>
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
const int  MAXN =2e5+10;
const int mod = 1e9 + 7;
const long long INF = 0x7f7f7f7f7f7f7f7f;
const int inf= 0x3f3f3f3f;
#define eps 1e-8
#define PI 3.1415926535898
#define lowbit(x) (x&(-x))
using namespace std ;
//getline(cin,s);
//set<ll>::iterator it;
//map<int,int>::iterator it;
//unordered_map
typedef long long ll;
struct node{
	ll x;
	int flag;
	bool operator < (const node&o) const
	{
		return x>o.x;
	} 
}a[MAXN];
int main()
{
	int n,k,vis=0,zheng=0,fu=0;
	scanf("%d %d",&n,&k);
	for(int i=1;i<=n;i++) 
	{
	    scanf("%lld",&a[i].x);
	    if(a[i].x<0)
		{
			a[i].x=-a[i].x;
			a[i].flag=-1;
			fu++;
		} 
		else a[i].flag=1,zheng++;
	}
	sort(a+1,a+1+n);
		ll ans=1;
	//判断答案是正负  觉得先判负 wa了一点点数据 可能wa在负数取模上 
	if(n==k)
	{
		for(int i=1;i<=n;i++)
		{
			ans=(ans%mod*a[i].x%mod*a[i].flag%mod)%mod;
		}
		printf("%lld\n",(ans+mod)%mod);
	}
	else
	{ 
    	if(k%2&&zheng==0)//负 
    	{
    		for(int i=n;i>=n-k+1;i--)
    		{
    			ans=(ans%mod*a[i].x%mod*a[i].flag%mod+mod)%mod;
			}
			printf("%lld\n",(ans+mod)%mod);
    	} 
    	else
    	{
    		ll num=0,sum=1,tot=0;
    		for(int i=1;i<=n;i++)
    		{
    			//printf("a %lld\n",a[i].x);
    			if(a[i].flag==-1)
    			{
    				num++;
    				if(tot+2<=k&&num==2)
    				{
    					ans=(ans%mod*sum%mod*a[i].x%mod+mod)%mod;
    					sum=1;
    					num=0;
    					tot+=2;
					}
					else sum=a[i].x;
				}
				else
				{
					ans=(ans%mod*a[i].x%mod+mod)%mod;
					tot++;
				}
				if(tot==k) break;
			}
			printf("%lld\n",(ans+mod)%mod);
    	}
	} 
}