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