乘积最大
题目描述
给定 NN 个整数 A1,A2,⋯ANA1,A2,⋯AN。请你从中选出 KK 个数,使其乘积最大。
请你求出最大的乘积,由于乘积可能超出整型范围,你只需输出乘积除以 109+9109+9 的余数。
注意,如果 X<0X<0,我们定义 XX 除以 109+9109+9 的余数是负(−X)(−X)除以 109+9109+9 的余数。
即:0−((0−x)%109+9)0−((0−x)%109+9)。
输入描述
输入格式:
第一行包含两个整数 N,KN,K。
以下 NN 行每行一个整数 AiAi。
其中,1≤K≤N≤105,−105≤Ai≤1051≤K≤N≤105,−105≤Ai≤105。
输出描述
输出一个整数,表示答案。
输入输出样例
示例
输入
5 3
-100000
-10000
2
100000
10000
输出
999100009
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
package apr28;
import java.util.Arrays;
import java.util.Scanner;
public class Test1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long mod = (int)1e9 +9;
int N = sc.nextInt();
int K = sc.nextInt();
int[] a = new int[N];
for (int i = 0; i < N; i++) {
a[i] = sc.nextInt();
}
Arrays.sort(a);
int r = N -1;
long res = 1;
if(K % 2 == 1){
res = a[N - 1];K--;
r--;
}
int sign = 1;
if(res < 0)
sign = -1;
int l = 0;
while (K > 0){
long x = (long)a[r] * a[r - 1];
long y = (long)a[l] * a[l + 1];
if(x * sign > y * sign)
{
res = ((x % mod) *(res % mod)) % mod;
r-=2;
}
else
{
res = ((y % mod) * (res % mod)) % mod;
l+=2;
}
K-=2;
}
System.out.println(res % mod);
}
}