LeetCode-878-第N个神奇数字
创始人
2024-02-07 21:54:20
0

在这里插入图片描述

1、二分查找

如果我们用函数f(x)f(x)f(x)表示数字小于x的神奇数字的个数,显然我们可以得到如下的公式:f(x)=⌊xa⌋+⌊xb⌋−⌊xc⌋f(x)=\left \lfloor \frac{x}{a} \right \rfloor+\left \lfloor \frac{x}{b} \right \rfloor-\left \lfloor \frac{x}{c} \right \rfloorf(x)=⌊ax​⌋+⌊bx​⌋−⌊cx​⌋,其中c为a和b的最小公倍数。因此我们可以在[a,an][a,a^n][a,an]的区间中进行二分查找并计算当前的f(x)f(x)f(x)的值并与目标值进行比较,最终返回具体的值。

class Solution {
public:const int MOD = 1e9 + 7;int nthMagicalNumber(int n, int a, int b) {long long l = min(a, b);long long r = (long long) n * min(a, b);int c = lcm(a, b);// a和b的最小公倍数while (l <= r) {long long mid = (l + r) / 2;long long cnt = mid / a + mid / b - mid / c;if (cnt >= n) {r = mid - 1;} else {l = mid + 1;}}return (r + 1) % MOD;}
};

2、数学优化

我们可以利用最小公倍数c来缩小n的范围。我们可以计算出f(c)f(c)f(c)的个数为c/a+c/b−1c / a + c / b - 1c/a+c/b−1,因此我们可以化简为f(x)=q∗f(c)+mf(x)=q*f(c)+mf(x)=q∗f(c)+m,因此我们只需要在此基础上查找其后m个神奇数字即可。

class Solution {
public:const int MOD = 1e9 + 7;int nthMagicalNumber(int n, int a, int b) {int c = lcm(a, b);int m = c / a + c / b - 1;int r = n % m;int res = (long long) c * (n / m) % MOD;if (r == 0) {return res;}int addA = a, addB = b;for (int i = 0; i <  r - 1; ++i) {if (addA < addB) {addA += a;} else {addB += b;}}return (res + min(addA, addB) % MOD) % MOD;}
};

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...