2023-05-17:一个正整数如果能被 a 或 b 整除,那么它是神奇的。

给定三个整数 n , a , b ,返回第 n 个神奇的数字。

因为答案可能很大,所以返回答案 对 10^9 + 7 取模 后的值。

输入:n = 4, a = 2, b = 3。

输出:6。

答案2023-05-17:

过程描述:

1.计算 ab 的最小公倍数 lcm

2.初始化变量 l 为0,变量 r(n * min(a, b)),其中 min(a, b) 表示 ab 中的最小值。在这个范围内通过二分查找获得第 n 个神奇数字。

3.对于每个二分查找猜测值,计算在 ab中出现的神奇数字个数:m/a + m/b。然后计算 ab 的公共倍数 lcmm 范围内出现的神奇数字个数:m/lcm

4.如果出现的神奇数字总数大于或等于 n,则将当前猜测值存储在变量 ans 中,并将右边界向左移动一位(即缩小区间的范围)。

5.如果出现的神奇数字总数小于 n,则将左边界向右移动一位(即扩大区间的范围),并继续迭代。

6.二分查找过程结束后,返回答案 ans % (10^9 + 7)

时间复杂度为 O(logN),空间复杂度为 O(1)。

在这个算法中,使用了二分查找来搜索第 n 个神奇数字。在最坏情况下,二分查找的迭代次数为 O(logN)。因此,时间复杂度为 O(logN)。

另外,在算法中只使用了几个整数变量来存储值和计算结果,所以空间复杂度为 O(1)。

go完整代码如下:

package main

func nthMagicalNumber(n int, a int, b int) int {
// 求a和b的最小公倍数
lcm := int64(a / gcd(a, b) * b)
var ans int64 = 0
// l = 0
// r = (long) n * Math.min(a, b)
l, r := int64(0), int64(n)*int64(min(a, b))
for l <= r {
m := (l + r) / 2
if m/int64(a)+m/int64(b)-m/lcm >= int64(n) {
ans = m
r = m - 1
} else {
l = m + 1
}
}
return int(ans % 1000000007)
} func gcd(a int, b int) int {
if b == 0 {
return a
}
return gcd(b, a%b)
} func min(a int, b int) int {
if a < b {
return a
}
return b
} func main() {
n := 1000000000
a := 40000
b := 40000
result := nthMagicalNumber(n, a, b)
println(result)
}

rust完整代码如下:

fn nth_magical_number(n: i32, a: i32, b: i32) -> i32 {
let n = n as i64;
let a = a as i64;
let b = b as i64;
// 求a和b的最小公倍数
let lcm = a / gcd(a, b) * b;
let mut ans = 0;
// l = 0
// r = (long) n * Math.min(a, b)
let mut l = 0;
let mut r = (n * std::cmp::min(a, b));
while l <= r {
let m = (l as i64 + r as i64) / 2;
if m / a as i64 + m / b as i64 - m / lcm as i64 >= n as i64 {
ans = m;
r = m - 1;
} else {
l = m + 1;
}
}
(ans % 1000000007) as i32
} fn gcd(a: i64, b: i64) -> i64 {
if b == 0 {
a
} else {
gcd(b, a % b)
}
} fn main() {
let n = 1000000000;
let a = 40000;
let b = 40000;
let result = nth_magical_number(n, a, b);
println!("{}", result);
}

c语言完整代码如下:

#include <stdio.h>

long long gcd(long long a, long long b) {
return b == 0 ? a : gcd(b, a % b);
} int nthMagicalNumber(int n, int a, int b) {
// 求a和b的最小公倍数
long long lcm = (long long)a / gcd(a, b) * b;
long long ans = 0;
// l = 0
// r = (long) n * Math.min(a, b)
for (long long l = 0, r = (long long)n * (a < b ? a : b), m = 0; l <= r;) {
m = (l + r) / 2;
if (m / a + m / b - m / lcm >= n) {
ans = m;
r = m - 1;
}
else {
l = m + 1;
}
}
return (int)(ans % 1000000007);
} int main() {
int n = 1000000000;
int a = 40000;
int b = 40000;
int result = nthMagicalNumber(n, a, b);
printf("%d\n", result);
return 0;
}

c++完整代码如下:

#include <iostream>
using namespace std; long long gcd(long long a, long long b) {
return b == 0 ? a : gcd(b, a % b);
} int nthMagicalNumber(int n, int a, int b) {
// 求a和b的最小公倍数
long long lcm = (long long)a / gcd(a, b) * b;
long long ans = 0;
// l = 0
// r = (long) n * Math.min(a, b)
for (long long l = 0, r = (long long)n * min(a, b), m = 0; l <= r;) {
m = (l + r) / 2;
if (m / a + m / b - m / lcm >= n) {
ans = m;
r = m - 1;
}
else {
l = m + 1;
}
}
return (int)(ans % 1000000007);
} int main() {
int n = 1000000000;
int a = 40000;
int b = 40000;
int result = nthMagicalNumber(n, a, b);
cout << result << endl;
return 0;
}

2023-05-17:一个正整数如果能被 a 或 b 整除,那么它是神奇的。 给定三个整数 n , a , b ,返回第 n 个神奇的数字。 因为答案可能很大,所以返回答案 对 10^9 + 7 取模的更多相关文章

  1. W - Doom HDU - 5239 线段树 找取模的规律+求一个很大的数的平方对一个数取模的写法 特别的模数==2^63-2^31

    这个题目一开始感觉还是有点难的,这个模数这么大,根本就不知道怎么写,然后去搜了题解,知道了怎么去求当x很大的时候x的平方对一个数取模怎么样不会爆掉. 然后还顺便发现了一个规律就是当一个数更新一定次数之 ...

  2. lucas定理解决大组合数取模

    LL MyPow(LL a, LL b) { LL ret = ; while (b) { ) ret = ret * a % MOD; a = a * a % MOD; b >>= ; ...

  3. 17.从键盘上输入一个正整数n,请按照以下五行杨辉三角形的显示方式, 输出杨辉三角形的前n行。请采用循环控制语句来实现。 (三角形腰上的数为1,其他位置的数为其上一行相邻两个数之和。) 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1

    17.从键盘上输入一个正整数n,请按照以下五行杨辉三角形的显示方式, 输出杨辉三角形的前n行.请采用循环控制语句来实现. (三角形腰上的数为1,其他位置的数为其上一行相邻两个数之和.) 1 1 1 1 ...

  4. 【附答案】Java 大数据方向面试题,你会几个?

    1.Collection 和 Collections的区别.   Collections是个java.util下的类,它包含有各种有关集合操作的静态方法.   Collection是个java.uti ...

  5. JAVA 之 每日一记 之 算法( 给定一个正整数,返回它在 Excel 表中相对应的列名称。 )

    题目: 给定一个正整数,返回它在 Excel 表中相对应的列名称. 例如: 1 -> A 2 -> B 3 -> C ... 26 -> Z 27 -> AA 28 -& ...

  6. 【Java EE 学习 73】【数据采集系统第五天】【参与调查】【导航处理】【答案回显】【保存答案】

    一.参与调查的流程 单击导航栏上的“参与调查”按钮->EntrySurveyAction做出相应,找到所有的Survey对象并转发到显示所有survey对象的页面上供用户选择->用户单击其 ...

  7. 有一个很大的整数list,需要求这个list中所有整数的和,写一个可以充分利用多核CPU的代码,来计算结果(转)

    引用 前几天在网上看到一个淘宝的面试题:有一个很大的整数list,需要求这个list中所有整数的和,写一个可以充分利用多核CPU的代码,来计算结果.一:分析题目 从题中可以看到“很大的List”以及“ ...

  8. [转帖]5G网速那么快,基站辐射会很大吗?

    5G网速那么快,基站辐射会很大吗? 鲜枣课堂 2019-04-20 21:19收藏55评论6社交通讯     题图来自东方IC,本文来自微信公众号:鲜枣课堂(ID:xzclasscom),作者:小枣君 ...

  9. 【knowledgebase】不要在一个很大的RDD上调用collect

    如果一个RDD很大以至于它的所有元素并不能在driver端机器的内存中存放下,请不要进行如下调用: val values = myVeryLargeRDD.collect()   collect将尝试 ...

  10. MySQL数据很大的时候

    众所周知,mysql在数据量很大的时候查询的效率是很低的,因为假如你需要 OFFSET 100000 LIMIT 5 这样的数据,数据库就需要跳过前100000条数据,才能返回给你你需要的5条数据.由 ...

随机推荐

  1. ElementPlus 表单 resetFields 无效问题解决方法

    最近在写一个项目,一个表单递交或者使用resetFields关闭后,再打开,原来的值还存在,后查了一下网上的方法,确定是el-form-item,必须要加prop,其值要与model相同,此问题得到完 ...

  2. Spring--AOP切入点表达式

    AOP工作流程 能够与做代理的那个类匹配得上的话,叫做代理对象,否则为原始对象. (SpringAOP的本质:代理模式) AOP的切入点表达式 切入点表达式描述的标准格式 描述方式一:定位到某某包下的 ...

  3. 10.4 提高叠加处理速度(2) (harib07d)

    ps:能力有限,若有错误及纰漏欢迎指正.交流 sheet_refreshsub void sheet_refreshsub(struct SHTCTL *ctl, int vx0, int vy0, ...

  4. 玩转SpringBoot原理:掌握核心技术,成为高级开发者

    本文通过编写一个自定义starter来学习springboot的底层原理,帮助我们更好的使用springboot集成第三方插件 步骤一:创建项目 步骤二:添加依赖 步骤三:创建自动配置类 步骤四:创建 ...

  5. ARP协议:网络世界的临门一脚

    大家好,我是风筝. 各位同学肯定见过关于网络的面试题,什么TCP协议和UDP的区别啦,IP协议工作在哪层啊等等,这都是网络中定义的各种协议.这些标准化的协议就是网络分层模型标准化的核心部分.要想搞懂网 ...

  6. 基于PaddleOCR的多视角集装箱箱号检测识别

    基于PaddleOCR的多视角集装箱箱号检测识别 一.项目介绍 集装箱号是指装运出口货物集装箱的箱号,填写托运单时必填此项.标准箱号构成基本概念:采用ISO6346(1995)标准 标准集装箱箱号由1 ...

  7. Java面试——Tomcat

    更多内容,前往个人博客 一.Tomcat 顶层架构 ​ Tomcat 中最顶层的容器是 Server,代表着整个服务器,从上图中可以看出,一个 Server可以包含至少一个 Service,用于具体提 ...

  8. [ACM]STL-dfs

    #include<iostream> using namespace std; int book[101],sum,n,e[101][101]; void dfs(int cur) { c ...

  9. python中socket使用UDP协议简单实现服务端与客户端通信

    UDP为不可靠传输,也就是发送方不关心对方是否收到消息,一般用于聊天软件.但现在的聊天软件虽然使用的是UDP协议,但已从代码层面上解决了丢失信息的问题. 下面使用python代码简单实现了服务端与客户 ...

  10. 在Jupyter Notebook,沉浸式体验ChatGPT

    大家好,我是章北海mlpy 写代码,修Bug是 ChatGPT 目前最擅长的领域之一 今天向大家推荐一个刚刚开源的Python包 安装后可以直接在IPython和Jupyter Notebook中直接 ...