题目如下:

解题思路:本题求的是第N个Magical Number,我们可以很轻松的知道这个数的取值范围 [min(A,B), N*max(A,B)]。对于知道上下界求具体数字的题目,可以考虑用二分查找。这样题目就从找出第N个Magical Number变成判断一个数是否是第N个Magical Number。假设n是其中一个Magical Number,显然n满足 n % A == 0 或者 n % B == 0。对于A来说,从A到n之间有n/A个Magical Number,而对B来说是n/B个Magical Number。但是n却并不是第(n/A + n/B)个Magical Number,因为这两者之间会有满足A * i == B * j数字出现,这样会造成重复,这样的数字有多少个呢?和A与B的最小公倍数有关,有n/LCM(A,B)个。

代码如下:

def gcd(m,n):
if not n:
return m
else:
return gcd(n, m%n)
def lcm(m, n):
if m*n == 0:
return 0
return int(m*n/gcd(m, n))
class Solution(object):
def getMagical(self,N,LCM,v1,v2):
low = 0
high = N
flag = False
while low <= high:
mid = (low + high) / 2
count = mid + (mid * v1) / v2 - (mid * v1) / LCM
if count == N:
flag = True
break
elif count < N:
low = mid + 1
else:
high = mid - 1
return flag,mid * v1 def nthMagicalNumber(self, N, A, B):
LCM = lcm(A, B)
minv, maxv = min(A, B), max(A, B) flag,res = self.getMagical(N,LCM,minv,maxv)
if flag:
return res % (pow(10,9) + 7)
#flag = False表示第n个magical number不是minv的倍数,用maxv再找一遍
return self.getMagical(N, LCM, maxv, minv)[1] % (pow(10,9) + 7)

最新文章

  1. js 倒计时
  2. Angularjs学习笔记9_JSON和JSONP
  3. Flex 布局2
  4. GridView基础知识
  5. memcache(使用php操作memcache)
  6. 菜鸟装逼指南--linux内核中听过就能记住的概念
  7. CentOS 6.6 系统升级到 CentOS 6.7
  8. PrismCDN 网络的架构解析,以及低延迟、低成本的奥秘
  9. LVS,Keepalived,HAproxy区别与联系
  10. 30天学会绘画 (Mark Kistler 著)
  11. querySelector() 方法
  12. monit安装配置
  13. 添加/删除-HTML DOM 常用对象 -BOM-打开和关闭窗口- history-location
  14. R语言基本操作函数(1)变量的基本操作
  15. docker 安装sentry
  16. angular-sanitize 插件的使用,获取带html标签的内容
  17. Nginx完整配置配置样例
  18. sense之间的数据传输
  19. Luogu P2572 [SCOI2010]序列操作 线段树。。
  20. POJ 1486 Sorting Slides(二分图匹配)

热门文章

  1. laravel5.6操作数据curd写法(查询构建器)
  2. python的final class
  3. MyEclipse上有main函数类运行报错:Editor does not contain a
  4. git查看某个文件的提交历史
  5. Redux生态系统
  6. python实现压缩文件成zip格式
  7. 【ABAP系列】SAP ABAP模块-ABAP动态指针写法的精髓部分
  8. Fira Code,可以让不等号!=直接显示出来的字体
  9. python的运算符和while循环
  10. MySql-第七篇单表查询