【leetcode】878. Nth Magical Number
2024-08-23 01:57:03
题目如下:
解题思路:本题求的是第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)
最新文章
- js 倒计时
- Angularjs学习笔记9_JSON和JSONP
- Flex 布局2
- GridView基础知识
- memcache(使用php操作memcache)
- 菜鸟装逼指南--linux内核中听过就能记住的概念
- CentOS 6.6 系统升级到 CentOS 6.7
- PrismCDN 网络的架构解析,以及低延迟、低成本的奥秘
- LVS,Keepalived,HAproxy区别与联系
- 30天学会绘画 (Mark Kistler 著)
- querySelector() 方法
- monit安装配置
- 添加/删除-HTML DOM 常用对象 -BOM-打开和关闭窗口- history-location
- R语言基本操作函数(1)变量的基本操作
- docker 安装sentry
- angular-sanitize 插件的使用,获取带html标签的内容
- Nginx完整配置配置样例
- sense之间的数据传输
- Luogu P2572 [SCOI2010]序列操作 线段树。。
- POJ 1486 Sorting Slides(二分图匹配)