leetcode 超级次方

题目链接
分析:b数组可以看成一个超级大的正数,那么就是求a的b次方,然后对1337取模。
假设b = 4321,a=3
知识点:快速幂,取模分配律
取模分配律:
(a⋅b) * mod m = [ (a mod m) * ( b mod m) ] mod m
第一步:拆分b这个超级大数
那么3的4321次方,也就是3的1次方,3的20次方,3的300次方,3的4000次方,然后再相乘。
第二步:快速幂
3的4000次方,可以拆分为3的1000次方,然后再4次方。
3的1000次方3平方的500次方
也就是3平方的平方的250次方 。。。。。一直下去即可。
第三步:取模分配律
存下来( b mod m) 和 (a mod m),再mod 1337
代码:

class Solution {
    public int Mod = 1337;
    public int superPow(int a, int[] b) {
        int len = b.length;
        int res = 1;
        for(int i = len-1 ; i >=0; i--){
        	// 计算a 的bi次方
            res = (int) ((long) res * pow(a, b[i]) % Mod);
            //本来是下一个bi乘10。。00  权重个0,这里转移到a中去,也就是 a 的bi*10..00次方,可以写为a的10..00次方的 bi次方。
            a = pow(a,10);
        }
        return res;
    }

    public int pow(int x, int n) {
        int res = 1;
        //快速幂
        while (n != 0) {
            if (n % 2 != 0) {
            	//计算 [ (a mod m) * ( b mod m) ] mod m
                res = (int) ((long) res * x % Mod);
            }
            //计算  ( b mod m)
            x = (int) ((long) x * x % Mod);
            n /= 2;
        }
        return res;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值