题目:
如果正整数可以被 A 或 B 整除,那么它是神奇的。
返回第 N 个神奇数字。由于答案可能非常大,返回它模10^9 + 7的结果。
示例 1:
输入:N = 1, A = 2, B = 3
输出:2
示例2:
输入:N = 4, A = 2, B = 3
输出:6
示例 3:
输入:N = 5, A = 2, B = 4
输出:10
示例 4:
输入:N = 3, A = 6, B = 4
输出:8
提示:
1 <= N<= 10^9
2 <= A<= 40000
2 <= B<= 40000
代码:
int maxGCDfunc(int A,int B){if(A<B){int temp=A;A=B;B=temp;}while(A%B){int tempVal=A%B;A=B;B=tempVal;}return B;}int nthMagicalNumber(int N, int A, int B) {int mod=1e9+7;int minLCM=A*B/maxGCDfunc(A,B);long long left=1,right=1e18,mid;while(left<right){mid=(left+right)/2;long long num=mid/A+mid/B-mid/minLCM;if(num<N){left=mid+1;}else{right=mid;}}return int(left%mod);}
想法:
使用二分法计算第N个神奇数字,思路是在1和最大的数字之间使用二分法,如果1和mid之间的神奇数字数目小于N,那么left=mid+1,否则,right=mid,直到left等于right时候停止;需要注意的是,1和mid之间的数字计算方式是,mid/A+mid/B-mid/minLCM,其中minLCM是A和B的最大公约数等于A*B/maxGCD(A,B),需要弄清数字规律;