计算两个数的超表中的第N个数
Calculate Nth number in supertable of two numbers
两个数字表a
和b
按升序写入并合并在一起,并删除重复项。现在的问题是在这个超表中找到比O(n)
复杂度更好的nth
数。
Limits
1<=A, B<=1000
1<=N<=1000000000
这是我的实现,但它是O(n)
,有人能提出更好的复杂度算法吗?谢谢
#include <iostream>
#include<map>
using namespace std;
long long int min(long long a, long long b){
if(a<b) return a;
else return b;
}
long long int get( long long int a, long long int b, long long int count) {
long long int val = 0,i;
long long int nexta = a;
long long int nextb = b;
for ( i = 0; i < count; i++) {
val = min(nexta, nextb);
nexta = val < nexta ? nexta : (nexta + a);
nextb = val < nextb ? nextb : (nextb + b);
}
return val;
}
int main() {
int t;
cin >> t;
while(t--){
long long int a,b,n;
cin >> a>> b>> n;
cout << get(a,b,n)<< endl;
}
return 0;
}
示例: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
如果我理解得对,那么arays A
和B
的指定如下:
A[i] = a*i
B[i] = b*i
那么应用二进制搜索至少可以得到CCD_ 8解。
考虑一些值x
。它是否会超出您的n
元素?您需要确定联合序列中x
之前有多少元素。这很容易做到:从A
有x/a
元素,从B
有x/b
元素,但oops——我们已经计算了两次常见元素。共有x/d
个元素,其中d
是a
和b
的最小公乘,所以我们减去x/d
。所以如果x/a + x/b - x/d>=n
,那么x
至少是第n
个元素,否则它在之前。
现在二进制搜索代码变为(伪代码(
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
也许甚至O(1)
解决方案也可用
相关文章:
- 如何在C++中从两个单独的for循环中添加两个数组
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 如何返回一个类的两个对象相加的结果
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 可以将两个相同类型的连续数组视为一个数组吗?
- 我想创建一个嵌套数组,该数组由另一个数组中的所有元素组成,但分为两个
- 如何同时对两个或三个数组进行排序?
- 在编译时将两个或多个不同大小的数组合并为一个数组
- 一个数组可以划分的最大子数组,使得不同子数组中任意两个元素的 GCD 始终为 1?
- 如何在编译时从两个索引序列创建一个数组
- 如何将两个字符或字符串数组附加到一个数组中
- 如何在一个数组(C++)中存储两个整数
- 通过两个交替元素来混合两个数组
- c++将输出(数字)保存到一个数组中.一次两个数字
- 创建一个函数,检查一个数组是否有两个相反的元素,复杂度小于n^2.(c++)
- 如何计算N以下只有一个或两个质因数的数的个数
- 在C++中将一个数组中的两个独立值存储到单个数组索引中
- 减去一个数组c++中的两个长正整数
- 在一个数组中查找求和为k的两个元素