#include <bits/stdc++.h>
using namespace std;

typedef long long int ll;
typedef vector<int> vi;			typedef vector<ll> vl;
typedef vector<vi> vvi; 		typedef vector<vl> vvl;
typedef pair<int, int> 	pii;	typedef pair<ll, ll> pll;
typedef vector<pii> vii; 		typedef vector<pll> vll;
typedef map<int,int> mii;
typedef vector<char> vc;
typedef vector<bool> vb;
#define endl '\n'
#define forn(i,n) for(int i=0;i<n;i++)
#define rforn(i,n) for(int i=n-1;i>=0;i--)
#define forne(i,n) for(int i=1;i<=n;i++)
#define rforne(i,n) for(int i=n;i>=1;i--)
#define forse(i,s,e) for(int i=s;i<e;i++)
#define rforse(i,s,e) for(int i=e-1;i>=s;i--)
#define all(x) x.begin(),x.end()
#define sz(x) (ll)x.size()
#define MOD 1000000007
#define F first
#define S second
#define pb push_back
#define pf push_front
#define rb pop_back
#define rf pop_front
#define in insert
#define mp make_pair
#define fill(a,x) memset(a,x,sizeof a);
#define trav(a,x) for(auto &a:x)
#define min3(a, b, c) min(min(a, b), c)
#define min4(a, b, c, d) min(min(a, b), min(c, d))
#define max3(a, b, c) max(max(a, b), c)
#define max4(a, b, c, d) max(max(a, b), max(c, d))
const ll INFL = 1e18;
const int INFI = 1e9;
#ifdef KARAN
	#include "../../trace.h"
#else
    #define trace(args...)
#endif

ll div_floor(const ll &a,const ll &b) { return a / b - (((a ^ b) < 0) and a % b);}
ll div_ceil(const ll &a,const ll &b) { return a / b + (((a ^ b) >= 0) and a % b);}
ll modpow(ll a, ll b, ll m = MOD){a %= m; ll res = 1; 
	while (b) {if (b & 1)res = (res * a) % m; a = (a * a) % m; b >>= 1;} return res;}
ll bpow(ll a, ll b){ll res = 1; while (b) {if (b & 1)res = res * a; a = a * a; b >>= 1;} return res;}
ll modinv(ll a, ll m = MOD) {return modpow(a, m - 2, m);}
void graph(vvi &adj, int m) {int x, y; forn(i, m){cin>>x>>y; adj[--x].pb(--y); adj[y].pb(x);}}

bool compare(ll a, ll b){
	return abs(a)>abs(b);
}

bool compare1(ll a, ll b){
	return abs(a)<abs(b);
}

void solve(){
	ll n, k; cin>>n>>k;
	ll cntr = 0;
	vl a(n);
	forn(i, n) cin>>a[i];
	sort(all(a), compare);

	ll answer = 1;
	ll cntneg = 0;
	ll cntpos = 0;
	ll smallneg = 1e9+10;
	ll smallpos = 1e9+10;

	forn(i, k){
		answer = ((answer*a[i])%MOD+MOD)%MOD;
		if(a[i]<0) cntneg++;
		if(a[i]>0) cntpos++;
		if(a[i]<0) smallneg = min(smallneg, abs(a[i]));
		else smallpos = min(smallpos, abs(a[i]));
	}

	if(answer==0||cntneg%2==0){
		cout<<answer<<endl;
		return;
	}

	ll largeneg = 0, largepos = 0;
	ll cntlneg = 0, cntlpos = 0;  
	forse(i, k, n){
		if(a[i]>0) largepos = max(largepos, a[i]), cntlpos++;
		else if(a[i]<0) largeneg = max(largeneg, abs(a[i])), cntlneg++;
	}

	if(cntlneg>0&&cntpos>0&&((largeneg*smallneg>=largepos*smallpos)||cntlpos==0||cntneg==0)){
		answer = (answer*modinv(smallpos))%MOD;
		answer = (answer*largeneg)%MOD;
		answer = (MOD - answer)%MOD;
		cout<<answer<<endl;
		return;
	}
	
	else if(cntlpos>0&&cntneg>0&&((largeneg*smallneg<=largepos*smallpos)||cntlneg==0||cntpos==0)){
		answer = (answer*modinv(smallneg))%MOD;
		answer = (answer*largepos)%MOD;	
		answer = (MOD-answer)%MOD;
		cout<<answer<<endl; 
		return;
	}
	else{
		sort(all(a), compare1);
		answer = 1;
		forn(i, k) answer = ((answer*a[i])%MOD+MOD)%MOD;
		cout<<answer<<endl;
		return;
	}
	assert(1<0);
}

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	#ifdef KARAN
		freopen("inp.txt", "r", stdin);
    	freopen("out.txt", "w", stdout);
    	freopen("err.txt", "w", stderr);
	#endif
	int t=1;
	// cin>>t;
	while(t--)
		solve();
}

Measured memory_bytes: 4772