当前位置: 首页 > 知识库问答 >
问题:

我如何确切地解决这个GCD?

邢寒
2023-03-14

https://www.codechef.com/problems/maxgcd

Chef有一个由N个整数组成的集合。如果子集有两个或更多的元素,则Chef将该集合的子集称为良好的。他把所有的好子集表示为S1,S2,S3,…,S2n-n-1。现在他把每个好子集Si的元素的GCD表示为Gi。厨师想要找到最大的GI。

输入

输入的第一行包含一个表示测试用例数量的整数T。测试用例的描述如下:“每个测试用例的第一行包含一个表示集合中元素的个数的整数N,第二行包含N个空格分隔的整数A1,A2,...,AN表示集合中的元素。

输出

对于每个测试用例,输出最大Gi

我的解决方案:

  1. 生成给定集的所有可能子集。
  2. 使用欧几里得算法计算每个集合的GCD
  3. 我试着找到所有这些的最大值。

这是我制作所有可能子集的代码:

vector< vector<int> > getAllSubsets(vector<int> set)
{
    vector< vector<int> > subset;
    vector<int> empty;
    subset.push_back( empty );

    for (int i = 0; i < set.size(); i++)
    {
        vector< vector<int> > subsetTemp = subset;

        for (int j = 0; j < subsetTemp.size(); j++)
            subsetTemp[j].push_back( set[i] );

        for (int j = 0; j < subsetTemp.size(); j++)
            subset.push_back( subsetTemp[j] );
    }
    return subset;
}

然而,我得到了TLE当与这种方法。我在这件事上哪里错了?

共有1个答案

长孙硕
2023-03-14

一个优化是,您永远不需要考虑大于2个元素的子集。这是因为如果你再添加一个元素,GCD只能减少。

这将导致O(n^2)算法。问题语句说n可以大到100000,所以我们需要做得更好。

问题还说,给定的值最多为500 000,因此GCD不能超过这个值。

count[i]=值i在数组中出现的次数

然后我们可以应用类似于埃拉托色尼的筛子的东西:对于一个固定值v,看看你是否能找到v的两个倍数(sum of count[multiple_of_v]>1)。如果可以,那么您可以拥有v的GCD。跟踪你能找到的最大值。

伪代码:

V = max(given array)
cnt[i] = how many times value i occurs in given array

for v = V down to 1:
  num_multiples_v = 0
  for j = v up to V:
    num_multiples_v += cnt[j]

  if num_multiples_v > 1: # TODO: break the inner loop when this is true
    print v as solution
    return

复杂度将是O(VloglogV),应该很快。

 类似资料:
  • 在我的MergeSort程序的这一部分中,我递归地划分一个名为“arr”的未排序数组。为此,我创建了两个子数组,“leftArr”和“rightArr”,然后我分别用“arr”的前半部分和“arr”的后半部分填充“leftArr”和和“right arr”。然后,我将使用递归来划分/排序leftArr和rightArr。 只是想澄清一下:中=长度; 要初始化rightArr,我执行以下操作: 当我

  • 启动错误 ApplicationContext.若要显示条件报告,请在启用“调试”的情况下重新运行应用程序。2019-10-17 15:44:43.968错误10460--[main]O.S.Boot.SpringApplication:应用程序运行失败 我的pom.xml:

  • 失败:生成失败,出现异常。 > 其中:Script“C:\flutter\packages\flutter_tools\gradle\flutter.gradle”行:900 错误:任务“:app:CompileFlutterBuildDebug”执行失败。 进程“command”C:\flutter\bin\flutter.bat“已完成,退出值为非零%1 生成在%12s中失败异常:Gradle

  • 问题内容: 我正在从Java Collection Framework寻找一个不允许使用null元素的类。 你认识一个吗 问题答案: 大多数实现(值得注意的例外)不接受。 是一种不允许值的专用实现。

  • 我正试图在Android Studio上调试我的项目——一个非常简单的东西——hello world。我得到这个信息: "安装未成功。应用程序无法安装:INSTALL_FAILED_MISSING_SHARED_LIBRARY apk列表:[0]'C:\Users\Pierr\AndroidStudioProjects\Hello\app\build\outputs\apk\debug\app d

  • 我想在一个controller方法中创建一个新的Role对象,然后该对象显示一个链接到Hibernate/H2数据库的数据存储库中的所有“角色”,但每次我尝试创建一个新对象时,都会出现一个SQL错误,对我来说这似乎不对。如果有人能帮忙,那就太好了。 下面是repo-https://github.com/danielturato/instateam-th 对于角色实体,我尝试了以下操作: 将名称字段