如果正整数可以被 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
思路如下:
以8与12 为例,其最大公约数为4,8:12=2:3;
因2*3*4=24,故增加24,则会有
+8,+16,+24;
+12,+24;
去除冗余部分,则每增加24,会出现(2+3)-1次数字,
故对于第N个数,其经历了N/((2+3)-1)次,
周期部分值为:N/(2+3-1)*24
且还剩余N%(2+3-1)个数,将其排序(24已被周期部分处理),
vc[0,8,12,16,24]
剩余部分值为 vc[N%(2+3-1)],
其和即为答案。代码如下
class Solution {
public:
int nthMagicalNumber(int N, int A, int B) {
//最大公约数
long long ma=getMa(A,B);
long long a=A/ma;
long long b=B/ma;
long long c=a+b-1;
long long coun=N/c;
long long ret=N%c;
vector<long> vc;
vc.push_back(0);
for(int i=1;i<b;i++){
vc.push_back(A*i);
}
for(int i=1;i<a;i++){
vc.push_back(B*i);
}
sort(vc.begin(),vc.end());
//cout<<coun<<" "<<a*b*ma<<" "<<vc[ret]<<endl;
//cout<<(40000*1000000000)%1000000000+7<<endl;
return (a*b*ma*coun+vc[ret])%(1000000000+7);
}
//获取最大公约数
int getMa(int A,int B){
if(A==B) return A;
int a= A > B ? A:B;
int b= A < B ? A:B;
if(a-b==b)
return b;
else return getMa(b,a-b);
}
};