(LeetCode 每日一题)1922. 统计好数字的数目 (数论 、快速幂)

题目:1922. 统计好数字的数目

在这里插入图片描述
在这里插入图片描述

思路:偶数位,可填的数有5个;奇数位,可填的数有4个。n很大,使用快速幂。时间复杂度0(logn)。

C++版本:

class Solution {
public:
    typedef long long LL;
    const int mod=1e9+7;
    LL qmi(LL x,LL q,int mod){
        LL res=1;
        while(q){
            if(q&1) res=res*x%mod;
            x=x*x%mod;
            q>>=1;
        }
        return res;
    }
    int countGoodNumbers(long long n) {
        LL x=(n+1)/2;
        LL y=n/2;
        return qmi(5,x,mod)%mod*qmi(4,y,mod) %mod;
    }
};

JAVA版本:

class Solution {
public:
    typedef long long LL;
    const int mod=1000000007;
    LL qmi(LL x,LL q,int mod){
        LL res=1;
        while(q){
            if(q&1) res=res*x%mod;
            x=x*x%mod;
            q>>=1;
        }
        return res;
    }
    int countGoodNumbers(long long n) {
        LL x=(n+1)/2;
        LL y=n/2;
        return qmi(5,x,mod)%mod*qmi(4,y,mod) %mod;
    }
};

Go版本:

const mod = 1000000007
func countGoodNumbers(n int64) int {
    x := (n+1)/2
    y := n/2
    return (int) (qmi(5,x,mod)%mod *qmi(4,y,mod) %mod);
}
func qmi(x , q ,mod int64) int64 {
    var res int64 = 1
    for q>0 {
        if q&1==1 {
            res = res * x %mod
        }
        x=x*x%mod
        q>>=1
    }
    return res
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值