解题思路:
1、如果k==n的话,那么全部数字都要选
2、如果k%2==0(即k为偶数),那么选出来的一个是非负数
3、如果k%2==1(即k为奇数)分两种:
(1)如果全部都为负数,那么全部都为负数,把最大最大负数取出来,然后变成了k为偶数的情况,要把符号改变过来
(2)否则的话,则一定至少有 1个非负数, 那么我们将最大的数取出来,然后变成了k为偶数的情况。
#include<bits/stdc++.h>
#define x first
#define y second
#define mem1(h) memset(h,-1,sizeof h)
#define mem0(h) memset(h,0,sizeof h)
#define mcp(a,b) memcpy(a,b,sizeof b)
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
typedef pair<int,int>PII;
typedef pair<double,double>PDD;
namespace IO{
inline LL read(){
LL o=0,f=1;char c=getchar();
while(c<'0'||c>'9'){
if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){
o=o*10+c-'0';c=getchar();}
return o*f;
}
}using namespace IO;
const int N=1e5+7,M=2e5+7,INF=0x3f3f3f3f,mod=1e9+9,P=131;
int n,k;
int a[N];
int main(){
cin>>n>>k;
for(int i=0;i<n;i++){
cin>>a[i];
}
sort(a,a+n);
int res=1;
int l=0,r=n-1;
int sign=1;
if(k&1){
res=a[r--];
k--;
if(res<0)sign=-1;
}
while(k){
LL x=(LL)a[l]*a[l+1],y=(LL)a[r]*a[r-1];
if(x*sign>y*sign){
res=x%mod*res%mod;
l+=2;
}else{
res=y%mod*res%mod;
r-=2;
}
k-=2;
}
cout<<res<<endl;
return 0;
}