Codechef:从数组元素中移除成对的公共因子,并找到最小乘积.为什么回答错误

Codechef: Remove pairwise common factors from array elements and find minimum product. Why Wrong Answer?

本文关键字:错误 为什么 数组元素 Codechef      更新时间:2023-10-16

问题声明:您得到一个由N个正整数组成的数组a,您可以对该数组执行以下操作
1) 在数组(i!=j)中拾取任意两个索引ij
2) 将A[i]A[j]除以A[i]和A[j]的一些公因子

您可以根据需要多次执行上述操作,其目的是最小化生成的数组的乘积。查找此最小产品。由于答案可能是一个大数字,所以打印出以1000000007为模的乘积。

输入:

第一行包含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;
}

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

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

有人能帮我发现吗?

谢谢!

这是错误的,因为您必须找到数组的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了。