C++ 不与V互质的最大数

C++ 不与V互质的最大数,c++,algorithm,C++,Algorithm,给定一个由N个整数组成的固定数组,其中N,因为您有一个大数组,但只有一个V,所以从分解V开始应该更快。在这之后,互质测试就变成了简单地寻找余数,它是对V的每个唯一因子的模 V = p_1*...*p_n 其中p_i是质数(您可以将其限制为不同的质数)。现在答案是 result = -1 for p_i: res = floor(R / p_i) * p_i if res >= L and res > result: result = res 因此,

给定一个由N个整数组成的固定数组,其中N,因为您有一个大数组,但只有一个
V
,所以从分解
V
开始应该更快。在这之后,互质测试就变成了简单地寻找余数,它是对
V

的每个唯一因子的模

V = p_1*...*p_n
其中p_i是质数(您可以将其限制为不同的质数)。现在答案是

result = -1
for p_i:
    res = floor(R / p_i) * p_i
    if res >= L and res > result:
        result = res
因此,如果您可以快速分解
V
,那么这将非常有效

编辑我没有注意到数组不必包含所有整数。在这种情况下,筛选它,即给定素数p_1,…,p_n创建一个“反向”筛选(即范围
[L,R]
中所有素数的倍数)。然后你可以把这个筛子和你的初始数组做一个交集

EDIT2要生成所有倍数的集合,可以使用此算法:

primes = [p_1, ..., p_n]
multiples = []
for p in primes:
    lower = floor(L / p)
    upper = floor(R / p)
    for i in [lower+1, upper]:
        multiples.append(i*p)
重要的是,从数学的角度来看,
V
[L,R]
范围内的每一个数字都是互质的,而这些数字不在
倍数中。现在您只需执行以下操作:

solution = -1
for no in initial_array:
    if no in multiples:
        solution = max(solution, no)
请注意,如果您将
result
作为一个集合来实现,那么
如果结果中没有:
检查是
O(1)

示例假设
V=6=2*3
initial_数组=[7,11,12,17,21]
L=10
R=22
。让我们从倍数开始。根据这个算法,我们得到

multiples = [10, 12, 14, 16, 18, 20, 22, 12, 15, 18, 21]
前7个是2的倍数(范围[10,22]),后4个是3的倍数(范围[10,22])。因为我们处理的是集合(
std::set
?),所以不会有重复的集合(12和18):


现在检查
初始数组
并检查
倍数中的值。我们得出最大的这个数字是
21
。事实上,
21
6
Daniel Bernstein的(算法杂志54:1,1-30(2005))回答了一个类似的问题,Nadia Heninger用它来识别坏的(重复因子)RSA模。这里的问题是在一大组非常大的数字之间找到公因子,而不是一次两个。

对a的每个元素进行因子计算,并为每个可能的素因子存储包含该因子的数字的排序列表

给定一个n包含O(logn)素数因子的数字,该列表将使用O(nlogn)内存


然后,对于每个查询(V,L,R),搜索V中的每个素因子,在[L,R]中包含该因子的最大数目是多少(这可以通过简单的二进制搜索完成)。

但是每个查询将有一个不同的V。您能详细说明您的方法吗?以及您所说的意思吗“@user3405426:我的意思是,如果
V=pow(2,17)*3;
那么就代替
GCD(n,V)==1
您可以测试
n%2==0&&n%3==0
,这比GCD和短路都简单。您需要在每个查询中运行一次因式分解,这比在每个数组元素中运行一次要好得多。一个算法将非常有用。我没有得到这样的结果。但是您想让我检查ra中的每个元素吗nge?这并不比简单地检查每个人的GCD好多少element@user3405426:回到互质的定义。它意味着不存在
n
的因子,也不存在
V
的因子。显然,对于任何
k
,它是
n
V
的辅因子,
k
的所有因子也是辅因子。因此一个只需要考虑素因子,没有重复,并且它短路——一旦发现< <代码> V < /代码>的任何因子被划分为<代码> n>代码>,你就知道它们不是互质的。@ USER 34054 26-O(log v),但实际上:Load(LG(V)),或者(V)的有效位的个数。1.因为2是最小的素数,2^16=65536<10^5<2^17,一个数字N这里的L是什么。范围的下限?我不理解你写的内容,请澄清我认为你误解了这个问题。我需要从与V@user3405426是的,
[L,R]
是范围。我已经重构了伪代码。@freakish:似乎范围
[L,R]
中的所有数字都不是候选数字,只有那些出现在数组中的数字。@BenVoigt是的,右。从数组左索引(L)到数组右索引的元素{R)只包括在需要考虑的范围内consideration@user3405426,找到因素是一件大事。而Pollard rho并没有准确地在时间O(logn)内工作.这是一个在线判断问题吗?你能发布一个链接吗?它来自运行codechef挑战。我会劝阻用户在此处发布解决方案来破坏乐趣尝试使用段树+RMQ@TejasPatel如何在这个问题中使用RMQ?我知道这是一个竞赛问题,所以我现在不想讨论它。请提供一些算法我觉得你的解决方案比其他的好。我没有把你的话改成“对A的每个元素进行因子计算,并为每个可能的素数存储一个包含这个因子的数字的排序列表。”
multiples = [10, 12, 14, 16, 18, 20, 22, 12, 15, 18, 21]
multiples = [10, 12, 14, 16, 18, 20, 22, 15, 21]