878. 第 N 个神奇数字

如果正整数可以被 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. 1 <= N <= 10^9
  2. 2 <= A <= 40000
  3. 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);
    }
};

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值