乘积最大
题目
给定N个整数A1, A2, … AN。请你从中选出K个数,使其乘积最大。
####请你求出最大的乘积,由于乘积可能超出整型范围,你只需输出乘积除以1000000009的余数。
####注意,如果X<0, 我们定义X除以1000000009的余数是负(-X)除以1000000009的余数。
####即:0-((0-x) % 1000000009)
【输入格式】
第一行包含两个整数N和K。
以下N行每行一个整数Ai。
对于40%的数据,1 <= K <= N <= 100
对于60%的数据,1 <= K <= 1000
对于100%的数据,1 <= K <= N <= 100000 -100000 <= Ai <= 100000
【输出格式】
一个整数,表示答案。
【输入样例】
5 3
-100000
-10000
2
100000
10000
【输出样例】
999100009
解答
#include<stdio.h>
#include<list>
#include<vector>
#include<iostream>
#include<math.h>
using namespace std;
typedef list<int> LIST;
typedef vector<int> VECTOR;
int main(){
LIST::iterator i;
LIST io;
short hzb=0,hfb=0;
long long Iz=-1,If=-1,hz=0,hf=0;
VECTOR num;
int n,k,x,K;
long long answer;
io.clear();
scanf("%d %d",&n,&k);
K=k;
while(n--){
scanf("%d",&x);
for(i=io.begin();i!=io.end();i++){
if(fabs(*i)<=fabs(x)) break;
}
io.insert(i,x);
}
/*for(i=io.begin();i!=io.end();i++) cout<<*i<<" ";
cout<<"\n";*/
for(i=io.begin();i!=io.end();i++){
if(k){
num.push_back(*i);
if(*i>0) Iz=num.size()-1;
if(*i<0) If=num.size()-1;
k--;
}
else{
if(hzb&&hfb) break;
if(*i>=0&&!hzb){
hz=*i;
hzb=1;
}
if(*i<0&&!hfb){
hf=*i;
hfb=1;
}
}
}
answer=1;
// printf("%d %d %lld %lld\n",num[Iz],num[If],hz,hf);
if((Iz!=-1&&If!=-1)){
for(int y=0;y<num.size();y++){
if(y==Iz||y==If) continue;
answer=(answer*num[y])%1000000009;
}
if(answer>0&&(hz!=0||hf!=0)){
if(hz*num[Iz]>=hf*num[If]) answer=((answer*hz)%1000000009)*num[Iz]%1000000009;
else answer=((answer*hf)%1000000009)*num[If]%1000000009;
}
else answer=((answer*num[Iz])%1000000009*num[If])%1000000009;
}
else if(If==-1){
for(int y=0;y<num.size();y++) answer=(answer*num[y])%1000000009;
}
else if(Iz=-1){
if(hz!=0){
for(int y=0;y<num.size();y++){
if(y==If) continue;
answer=(answer*num[y])%1000000009;
}
answer=(answer*hz)%1000000009;
}
else if(K%2==0){
for(int y=0;y<num.size();y++) answer=(answer*num[y])%1000000009;
}
else {
i=io.end();
i--;
while(K--){
answer=(answer**i)%1000000009;
i--;
}
}
}
else answer=0;
printf("%lld",answer);
}