给定两个数字a和b,我们必须找到可被a或b整除的第n个数字。
格式如下所示:
输入: 第一行由整数T组成,表示测试用例的数量。 第二行包含三个整数a,b和N
输出 对于每个测试用例,打印第N个 新的数字。
约束:
1≤t≤105
1≤a,b≤104
1≤N≤10
示例输入
1
2 3 10
示例输出
15
解释
可被2整除的数字 或3是:2,3,4,6,8,9,10,12,14,15和第10个数字是15
我的代码
test_case=input()
if int(test_case)<=100000 and int(test_case)>=1:
for p in range(int(test_case)):
count=1
j=1
inp=list(map(int,input().strip('').split()))
if inp[0]<=10000 and inp[0]>=1 and inp[1]<=10000 and inp[1]>=1 and inp[1]<=1000000000 and inp[1]>=1:
while(True ):
if count<=inp[2] :
k=j
if j%inp[0]==0 or j%inp[1] ==0:
count=count+1
j=j+1
else :
j=j+1
else:
break
print(k)
else:
break
问题陈述: 对于单个测试用例输入2000 3000 100000,需要一秒多的时间才能完成。如果我能在不到1秒的时间内得到结果,我想要。有没有一个时间有效的方法解决这个问题,可能是我们可以在这里使用一些数据结构和算法吗?
答案 0 :(得分:0)
我不确定要准确掌握你想要完成的事情。但如果我做对了,答案不是简单的b *(N / 2)?因为你列出了两个数字的倍数,所以第N个总是你列出的第二个数字N / 2.
在您的初始示例中,3 * 10/2 = 15。 在代码示例中,它将是3000 * 100000/2 = 150'000'000
<强>更新强> 使用set和list计算所需值的代码,以加快计算过程。我仍然想知道,如果有人碰巧偶然发现奇数指数会再次出现...
a = 2000
b = 3000
c = 100000
a_list = [a*x for x in range(1, c)]
b_list = [b*x for x in range(1, c)]
nums = set(a_list)
nums.update(b_list)
nums = sorted(nums)
print(nums[c-1])
此代码在我的笔记本电脑上运行0.14秒。这远远低于要求的阈值。尽管如此,这些值将取决于代码运行的机器。
答案 1 :(得分:0)
对于每两个数字,k
将为k=a*b
。a
。在b
下只有k
和s = set(a*1, b*1, ... a*(b-1), b*(a-1), a*b)
的倍数。可以像这样创建这个集合:
a=2, b=3
假设我们取值s = (2,3,4,6)
然后c
。这些是[1 - 4] => (2,3,4,6)
[5 - 8] => 6 + (2,3,4,6)
[9 - 12] => 6*2 + (2,3,4,6)
...
:
c
请注意,值以可预测的模式重复。要获得该行,您可以获取s
的值并除以集n
的长度(称之为c
)。设定索引是n
的模1
。减去问题中使用的1
索引的row = floor((c-1)/n)
column = `(c-1) % n`
result = (a*b)*row + s(column)
。
a = 2000
b = 3000
c = 100000
s = list(set([a*i for i in range(1, b+1)] + [b*i for i in range(1, a+1)]))
print((((c-1)//len(s)) * (a*b)) + s[(c - 1)%len(s)])
Python impl:
{{1}}