问题陈述:
给出一个N个正整数的数组A,你可以对数组执行以下操作
1)在数组中选择任意两个索引i
和j
(i!= j)
2)将A[i]
和A[j]
除以A [i]和A [j]
您可以根据需要多次执行上述操作,目的是最小化生成的数组的乘积。找到这个最低产品。由于答案可能很大,请以1000000007的模数打印产品。
INPUT:
第一行包含T,多个测试用例。每个测试用例包含2行。每个测试用例的第一行包含单个整数N,即数组的大小。
每个测试用例的第二行包含N个空格分隔的整数,即数组A
输出:
对于每个测试用例,输出单行指示该测试用例的答案
CONSTRAINTS:
1<=T<=10
30 points : 1<=N<=2000, 1<=A[i]<=10^6
70 points : 1<=N<=20000, 1<=A[i]<=10^8
SAMPLE INPUT:
1
3
2 3 6
SAMPLE OUTPUT:
1
我的代码:
#include <iostream>
#include <vector>
using namespace std;
// Take two elements of vector by reference. Then divide them by their common factors.
void common(unsigned long long int &sm, unsigned long long int &big)
{
while (sm%2 == 0 && big%2 == 0)
{
sm /= 2;
big /= 2;
}
for (unsigned long long int i = 3; i <= big && i <= sm; i = i+2)
{
while (sm%i == 0 && big%i == 0)
{
sm /= i;
big /= i;
}
}
}
int main()
{
long long int T, N;
vector<unsigned long long int> v(20000);
unsigned long long int prod = 1;
cin >> T;
while ( T-- )
{
cin >> N;
for ( long long int i = 0;i < N; i++ )
cin >> v[i];
for ( long long int i = 0; i < N; i++ )
for ( long long int j = i+1; j < N; j++ )
{
if (v[j] >= v[i] && v[j] % v[i] == 0) {
v[j] /= v[i];
v[i] = 1;
break;
}
if (v[i] > v[j] && v[i] % v[j] == 0) {
v[i] /= v[j];
v[j] = 1;
continue;
}
common( v[i], v[j] );
}
prod = 1;
for ( long long int i = 0; i < N; i++ )
prod = (prod * v[i]) % 1000000007;
cout << prod << endl;
}
return 0;
}
我理解问题制定者给出的解决方案。它是找到每个元素的主要因素,然后以有效的方式消除它们。
但我不清楚的是为什么我的算法不起作用,错误在哪里。不幸的是,测试用例不公开,否则我本可以自己调试代码。
任何人都可以帮我发现它吗?
谢谢!
答案 0 :(得分:4)
这是错误的,因为您必须找到阵列的minimum
产品。使用您的代码,您不必搜索以最小化此产品,只需在可能的情况下划分整数。
考虑以下示例:
1
5
1 3 6 9 2
输出必须为1.使用您的代码,它是9.为什么?因为您选择第3对和第6对,并获得1 1 2 9 2
。但是如果你得到第3和第9对,你得到1 1 6 3 2
......然后你可以拥有1 1 2 1 2
。