Codechef:从数组元素中删除成对公共因子并找到最小乘积。为什么错误的答案?

时间:2014-04-27 09:36:21

标签: c++ algorithm

问题陈述: 给出一个N个正整数的数组A,你可以对数组执行以下操作 1)在数组中选择任意两个索引ij(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;
}

我理解问题制定者给出的解决方案。它是找到每个元素的主要因素,然后以有效的方式消除它们。

但我不清楚的是为什么我的算法不起作用,错误在哪里。不幸的是,测试用例不公开,否则我本可以自己调试代码。

任何人都可以帮我发现它吗?

谢谢!

1 个答案:

答案 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