【题目描述】
【思路】
模运算与乘除都是三级运算符。如果同时遇到两个运算符在一个表达式内,它的结合方向是自左至右,因此:
如果写成 ans =( ans % mod * x % mod) % mod。由于ans % mod之后可能为10 ^ 9 , x最大为10^10,两数相乘会爆long(2 ^ 32 约为10 ^ 19,因此 要写成:x % mod * ans % mod
import java.util.Scanner;
import java.util.Arrays;
import java.lang.Math;
public class Main{
static int N = 100010;
static long f[] = new long[N];
static long mod = 1000000009;
public static void main(String args[]){
Scanner reader = new Scanner(System.in);
int n = reader.nextInt(), k = reader.nextInt();
for(int i = 0; i < n; i ++)
f[i] = reader.nextInt();
//要使得乘积最大
Arrays.sort(f, 0, n);
long ans = 1; // ans应该为1而不是为0
int l = 0, r = n - 1; //双指针
int sign = 1;
if( (k &1) == 1)//奇数
{
ans = f[r --];
k --;
//结果为负数
if( ans < 0) sign = - 1;
}
while( k > 0)
{
//左右成对乘积比较
long x = (long) f[r] * f[r - 1];
long y = (long) f[l] * f[l + 1];
if( sign * x > sign * y)//左边一对乘积较大
{
ans = x % mod * ans % mod;
r -= 2;
}else{
ans = y % mod * ans % mod;
l += 2;
}
k -= 2;
}
System.out.println(ans );
/*
System.out.println(-8 %5);// -3
System.out.println( 8 %5);// 3
System.out.println( 8 % -5);// 3
*/
}
}