题目链接 https://leetcode-cn.com/problems/nth-magical-number/description/
如果正整数可以被 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. 使用周期,解答的简化了运算量
2.两个int相乘,会变成long,特别注意!
1 <= N <= 10^9
2 <= A <= 40000
2 <= B <= 40000
class Solution {
public:
int gcd(int x, int y)
{
if(y == 0) return x;
if(x < y) return gcd(y,x);
else return gcd(y, x%y);
}
int nthMagicalNumber(int N, int A, int B) {
int n=A*B; //可能不是最小公倍数
int t=A+B-gcd(A,B);
int l=N/t;
int left=N-l*t;
long long pp=l*n %1000000007; //这里特别注意,数字变大,超出范围
if(left==0) return pp;
set <int> res;
int id1=1,id2=1,res1;
while(res.size()!=t)
{
res1=id1*A;
if(res1<n+1)
{
if(!res.count(res1))
res.insert(res1);
id1++;
}
res1=id2*B;
if(res1<n+1)
{
if(!res.count(res1))
res.insert(res1);
id2++;
}
}
set<int>::iterator it=res.begin();
while(left>1) {it++;left--;
cout<<left<<endl;}
res1=*it;
return (pp+res1)%1000000007;;
}
};
也可以使用优先级队列或者2 3 5的那个思路