【发布时间】:2015-10-11 13:12:19
【问题描述】:
https://www.codechef.com/problems/MAXGCD
Chef 有一个由 N 个整数组成的集合。如果该子集有两个或更多元素,Chef 称该子集的子集是好的。他将所有好的子集表示为 S1、S2、S3、...、S2N-N-1。现在他将每个好的子集 Si 的元素的 GCD 表示为 Gi。 Chef 想要找到最大 Gi。
输入
输入的第一行包含一个整数 T,表示测试用例的数量。 T 测试用例的描述如下。” 每个测试用例的第一行包含一个整数 N,表示集合中元素的数量。第二行包含 N 个以空格分隔的整数 A1、A2、...、AN,表示集合的元素。
输出
对于每个测试用例,输出最大Gi
我的解决方案:
- 我生成给定集合的所有可能子集。
- 我使用欧几里得算法计算每组的 GCD
- 我试图找到所有这些中的最大值。
这是我制作所有可能子集的代码:
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。我哪里错了?
【问题讨论】:
-
对于这类问题,您通常需要一点点数学知识。假设我告诉你 GCD (48, 72) = 24。对于任意 x 的 GCD (48, 72, x) 或任意 x, y 的 GCD (48, 72, x, y, z) 你能说什么,z?回答完这个问题,思考一下其中的含义。有什么理由去检查所有个好的集合吗?
-
我得出的结论是,如果 GCD(x,y) 为 1,那么任何包含 (x,y) 的超集的 GCD 都将为 1。但这对我有什么用处?我真的不能在任何地方使用它。
-
@gnasher729,我该怎么做呢?
-
这只是影响的一小部分。想多了?