#include <bits/stdc++.h>
#define rep(i,n) for(int i=0;i<n;++i)
#define all(x) (x).begin(),(x).end()
using namespace std;
const int INF=1145141919,MOD=1e9+7;
const int64_t LINF=8931145141919364364,LMOD=998244353;
// const int dy[]={0,-1,0,1,1,-1,-1,1};
// const int dx[]={1,0,-1,0,1,1,-1,-1};

using fint64 = int_fast64_t;
template<fint64 MOD>
struct ModInt {
	fint64 x;
	ModInt():x(0){}
	ModInt(fint64 x):
		x(x>=0?x%MOD:(MOD-(-x)%MOD)%MOD)
		{}
	// 負号
	ModInt operator -() const{
		return ModInt(-x);
	}
	// 加算
	ModInt &operator +=(const ModInt &rhs){
		x+=rhs.x;
		if(x>=MOD) x-=MOD;
		return (*this);
	}
	ModInt operator +(const ModInt &rhs) const{
		return ModInt(*this)+=rhs;
	}
	// 減算
	ModInt &operator -=(const ModInt &rhs){
		x+=MOD-rhs.x;
		if(x>=MOD) x-=MOD;
		return (*this);
	}
	ModInt operator -(const ModInt &rhs) const{
		return ModInt(*this)-=rhs;
	}
	// 乗算
	ModInt &operator *=(const ModInt &rhs){
		x*=rhs.x;
		if(x>=MOD) x%=MOD;
		return (*this);
	}
	ModInt operator *(const ModInt &rhs) const{
		return ModInt(*this)*=rhs;
	}
	// 除算
	ModInt &operator /=(const ModInt &rhs){
		(*this)*=rhs.inverse();
		return (*this);
	}
	ModInt operator /(const ModInt &rhs) const{
		return ModInt(*this)/=rhs;
	}
	// 等号
	bool operator ==(const ModInt &rhs){
		return x==rhs.x;
	}
	bool operator !=(const ModInt &rhs){
		return x!=rhs.x;
	}
	// 累乗
	ModInt pow(fint64 n) const{
		fint64 tmp=x;
		fint64 ret=1;
		while(n>0){
			if(n&1) ret=ret*tmp%MOD;
			tmp=tmp*tmp%MOD;
			n>>=1ll;
		}
		return ModInt(ret);
	}
	// 逆元
	ModInt inverse() const{
		fint64 a=x,b=MOD,s=1,t=0;
		while(b>0){
			fint64 u=a/b;
			a-=u*b;
			s-=u*t;
			swap(a,b);
			swap(s,t);
		}
		return ModInt(s);
	}
	// 入出力
	friend istream &operator >>(istream &lhs,ModInt<MOD> &rhs){
		fint64 x; lhs>>x;
		rhs=ModInt<MOD>(x);
		return lhs;
	}
	friend ostream &operator <<(ostream &lhs,const ModInt<MOD> &rhs){
		return lhs<<rhs.x;
	}
};

using mint = ModInt<MOD>;
int main() {
	int n, k; cin >> n >> k;
	int64_t a[n]; rep(i,n) cin >> a[i];
	sort(a, a + n);
	vector<int64_t> v;
	int zero = 0;
	{
		int pl = 0;
		rep(i,n) {
			if(a[i] == 0) ++zero;
			else {
				v.push_back(a[i]);
				if(a[i] > 0) ++pl;
			}
		}
		if(n - zero < k) {
			cout << 0 << '\n';
			return 0;
		}
		if(pl == 0) {
			if(k % 2 == 1) {
				if(zero > 0) {
					cout << 0 << '\n';
				} else {
					reverse(v.begin(), v.end());
					mint ans = 1;
					for(int i = 0; i < k; ++i) {
						ans *= v[i];
					}
					cout << ans << '\n';
				}
				return 0;
			} else {
				mint ans = 1;
				for(int i = 0; i < k; ++i) {
					ans *= v[i];
				}
				cout << ans << '\n';
				return 0;
			}
		}
	}
	sort(v.begin(), v.end(), [](int64_t a, int64_t b) {
		return abs(a) > abs(b);
	});
	mint ans = 1;
	int mi = 0;
	int64_t plv = 0, miv = 0;
	for(int i = 0; i < k; ++i) {
		ans *= v[i];
		if(v[i] < 0) {
			mi++;
			miv = v[i];
		} else {
			plv = v[i];
		}
	}
	if(mi % 2 == 0) {
		cout << ans << '\n';
	} else {
		if(v.size() == k) {
			if(zero > 0) {
				cout << 0 << '\n';
			} else {
				cout << ans << '\n';
			}
			return 0;
		}
		int64_t pl_, mi_;
		bool pf = false, mf = false;
		for(int i = k; i < (int)v.size(); ++i) {
			if(v[i] > 0 and not pf) {
				pl_ = v[i];
				pf = true;
			}
			if(v[i] < 0 and not mf) {
				mi_ = v[i];
				mf = true;
			}
		}
		if(pf and not mf) {
			if(miv != 0) {
				ans /= miv;
				ans *= pl_;
			}
		} else if(mf and not pf) {
			if(plv != 0) {
				ans /= plv;
				ans *= mi_;
			}
		} else {
			if(miv == 0) {
				ans /= plv;
				ans *= mi_;
			} else if(plv == 0) {
				ans /= miv;
				ans *= pl_;
			} else {
				if(pl_ * plv > mi_ * miv) {
					ans /= miv;
					ans *= pl_;
				} else {
					ans /= plv;
					ans *= mi_;
				}
			}
		}
		cout << ans << '\n';
	}
	return 0;
}

Measured memory_bytes: 6932