Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 计算两个数的超级表中的第n个数_C++_Algorithm_C++11 - Fatal编程技术网

C++ 计算两个数的超级表中的第n个数

C++ 计算两个数的超级表中的第n个数,c++,algorithm,c++11,C++,Algorithm,C++11,写入两个编号表a和b,并按升序合并在一起,删除重复项。现在的问题是在这个超表中找到比复杂度更好的第n个数 Limits 1<=A, B<=1000 1<=N<=1000000000 示例: A=3,B=5 表A=3、6、9、12、15、18等 表B=5、10、15、20等 合并后:3、5、6、9、10、12、15、15、18、20等等 删除重复项:3、5、6、9、10、12、15、18、20等等 对于N=2,如果我理解正确,则超级表的第二个元素是5,即ArayA和

写入两个编号表
a
b
,并按升序合并在一起,删除重复项。现在的问题是在这个超表中找到比复杂度更好的第n个数

Limits 

1<=A, B<=1000

1<=N<=1000000000
示例: A=3,B=5

表A=3、6、9、12、15、18等

表B=5、10、15、20等

合并后:3、5、6、9、10、12、15、15、18、20等等

删除重复项:3、5、6、9、10、12、15、18、20等等


对于N=2,如果我理解正确,则超级表的第二个元素是5,即Aray
A
B
指定如下:

A[i] = a*i
B[i] = b*i
然后,通过应用二进制搜索,至少可以得到
O(logn)

考虑一些值
x
。它是否会超出您的
n
th元素?您需要确定联合序列中有多少元素在
x
之前。这很容易做到:从
A
中有
x/A
元素,从
B
中有
x/B
,但糟糕的是,我们已经计算了两次公共元素。有
x/d
公共元素,其中
d
a
b
的最小公倍数,所以让我们减去
x/d
。因此,如果
x/a+x/b-x/d>=n
,那么
x
至少是
n
第th个元素,否则它在前面

现在二进制搜索代码变为(伪代码)


甚至可能有
O(1)
解决方案可用

这更适合于is表
A
B
任意或生成,如您的示例所示,即每一步添加相等的值?@Petr是的,先生,他们的表是合并的。您确切地说“表”是什么意思?你是说算术级数吗?你每
a*B=15
有一个循环来知道使用哪个表/索引。
A[i] = a*i
B[i] = b*i
l = 0
r = a * n + 1
d = lcm(a,b)
while r-l>1
    m = (r+l)/2
    cnt = m/a + m/b - m/d
    if cnt >= n
        r = m
    else l = m
your answer is r