leetcode------878. 第 N 个神奇数字 [1]

题目链接 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

  1. 2 <= A <= 40000
  2. 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的那个思路

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值