# 乘积最大
给定 N 个整数 A1,A2,…AN。
请你从中选出 K 个数,使其乘积最大。
请你求出最大的乘积,由于乘积可能超出整型范围,你只需输出乘积除以 1000000009 的余数。
注意,如果 X<0, 我们定义 X 除以 1000000009 的余数是负(−X)除以 1000000009 的余数,即:0−((0−x)%1000000009)
**输入格式**
第一行包含两个整数 N 和 K。
以下 N 行每行一个整数 Ai。
**输出格式**
输出一个整数,表示答案。
**数据范围**
```
1≤K≤N≤105,
−105≤Ai≤105
```
**输入样例1:**
```
5 3
-100000
-10000
2
100000
10000
```
**输出样例1:**
```
999100009
```
**输入样例2:**
```
5 3
-100000
-100000
-2
-100000
-100000
#### 输出样例2:
-999999829
```
以下选项错误的是?
## aop
### before
```cpp
#include
using namespace std;
```
### after
```cpp
```
## 答案
```cpp
#define ll long long
#define inf 0x7fffffff
const int N = 1e5 + 10;
const int mod = 1e9 + 9;
int n, k;
int a[N];
ll ans = 1;
int main()
{
cin >> n >> k;
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
sort(a + 1, a + n + 1);
int sign = 1;
if (k % 2)
{
ans = a[n];
n--;
k--;
}
int i = 0, j = n;
while (k)
{
ll tmp1 = (ll)a[i] * a[i + 1], tmp2 = (ll)a[j] * a[j - 1];
if (tmp1 * sign > tmp2 * sign)
{
ans = (tmp1 % mod * ans) % mod;
i += 2;
}
else
{
ans = (tmp2 % mod * ans) % mod;
j -= 2;
}
k -= 2;
}
printf("%lld\n", ans);
return 0;
}
```
## 选项
### A
```cpp
#define mem(a, b) memset(a, b, sizeof(a))
#define mod 1000000009
typedef long long ll;
const int maxn = 1e6 + 5;
const double esp = 1e-7;
const int ff = 0x3f3f3f3f;
map::iterator it;
struct node
{
ll x;
int f;
} a[maxn];
int n, k;
bool cmp(node x, node y)
{
return x.x > y.x;
}
ll solve(int o)
{
ll ans = 1;
int cnt = 0;
if (o == 0)
{
for (int i = 1; i <= k; i++)
{
ans = (ans * a[i].x) % mod;
if (a[i].f == 1)
cnt++;
}
}
else
{
for (int i = n; i > n - k; i--)
{
ans = (ans * a[i].x) % mod;
if (a[i].f == 1)
cnt++;
}
}
if (cnt & 1)
return ans * (-1);
return ans;
}
int main()
{
cin >> n >> k;
int flag = 0;
int cnt = 0;
for (int i = 1; i <= n; i++)
{
scanf("%lld", &a[i].x);
if (a[i].x < 0)
{
a[i].f = 1;
a[i].x = -a[i].x;
cnt++;
}
else if (a[i].x > 0)
a[i].f = 0;
else
{
i--;
n--;
flag = 1;
}
}
sort(a + 1, a + n + 1, cmp);
ll ans = 0;
if (n < k)
ans = 0;
else if (cnt == n)
{
if (k & 1)
ans = solve(1);
else
ans = solve(0);
}
else if (cnt == 0)
ans = solve(0);
else
{
int tmp = 0;
for (int i = 1; i <= k; i++)
if (a[i].f == 1)
tmp++;
if (tmp % 2 == 0)
ans = solve(0);
else
{
ans = -1;
int p = -1, q = -1;
for (int i = k + 1; i <= n; i++)
if (a[i].f == 0)
{
q = i;
break;
}
for (int i = k; i >= 1; i--)
if (a[i].f == 1)
{
p = i;
break;
}
if (p != -1 && q != -1)
{
swap(a[p], a[q]);
ans = solve(0);
swap(a[p], a[q]);
}
p = -1, q = -1;
for (int i = k + 1; i <= n; i++)
if (a[i].f == 1)
{
q = i;
break;
}
for (int i = k; i >= 1; i--)
if (a[i].f == 0)
{
p = i;
break;
}
if (p != -1 && q != -1)
{
swap(a[p], a[q]);
ans = max(ans, solve(0));
swap(a[p], a[q]);
}
if (ans < 0)
ans = solve(1);
}
}
if (ans < 0)
if (flag)
{
cout << 0 << endl;
return 0;
}
cout << ans << endl;
return 0;
}
```
### B
```cpp
#define mod 1000000009
const int N = 100010;
typedef long long LL;
int a[N];
int n, k;
int main()
{
cin >> n >> k;
for (int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
sort(a, a + n);
LL res = 1;
if (n == k)
{
for (int i = 0; i < n; i++)
{
res = (res * a[i]) % mod;
}
cout << res % mod;
return 0;
}
if (a[n - 1] < 0)
{
if (k % 2 == 1)
{
for (int i = n - 1; i >= n - k; i--)
{
res = (res * a[i]) % mod;
}
}
else
{
for (int i = 0; i < k; i++)
{
res = (res * a[i]) % mod;
}
}
cout << res << endl;
return 0;
}
int l = 0, r = n - 1;
if (k % 2 == 1)
{
res = a[r--];
k--;
}
while (k)
{
LL x = (LL)a[l] * a[l + 1], y = (LL)a[r] * a[r - 1];
if (x > y)
{
res = x % mod * res % mod;
l += 2;
}
else
{
res = y % mod * res % mod;
r -= 2;
}
k -= 2;
}
cout << res << endl;
return 0;
}
```
### C
```cpp
int main()
{
int n, k;
long long ans;
cin >> n >> k;
vector num;
for (int i = 0; i < n; i++)
{
int temp;
cin >> temp;
num.push_back(temp);
}
sort(num.begin(), num.end());
if (k % 2 != 0)
{
ans = num.back();
k = k - 1;
num.pop_back();
}
else
ans = 1;
while (k > 0)
{
if ((num[0] * num[1]) > num.at(num.size() - 1) * num.at(num.size() - 2))
{
ans = ans * num[0] * num[1] % 1000000009;
num.erase(num.begin(), num.begin() + 1);
}
else
{
ans = ans * num.at(num.size() - 1) * num.at(num.size() - 2) % 1000000009;
num.pop_back();
num.pop_back();
}
k -= 2;
}
cout << ans;
return 0;
}
```