Leetcode 372. Super Pow

简介: 真正的解法其实思路很简单,我随便举个例子就很容易理解了,假设要求(123^4567)%1337,只需要把这个幂式子分解成几个层次,然后把球模加到每一层中间就很容易计算出来了。

题目链接:Super Pow


Your task is to calculate ab mod 1337 where a is a positive integer and b is an extremely large positive integer given in the form of an array.

 简短的题目,让你求(a^b)%1337的值,但b是以数组的形式给出的,这就意味着b可能非常非常大。看到题目我立马想到了大数的快速幂取模,利用java自带的Biginteger应该可以很轻易做的,但仔细想想,其实java做做大数的运算非常慢的,虽然代码简单了,但实际上是让计算机去做大量的计算,所以我就放弃了这种想法,不知道直接大数快速幂取模能不能ac。

 真正的解法其实思路很简单,我随便举个例子就很容易理解了,假设要求(123^4567)%1337,只需要把这个幂式子分解成几个层次,然后把球模加到每一层中间就很容易计算出来了。

后把球模加到每一层中间就很容易计算出来了。

123^4567 = ((((((123)^4)^10*(123)^5)^10)*123^6)^10)*123^7

 看起来括号有点多。。。。暂时没想到什么直观的方法表示出来。 这里为了公式简短,我没加mod。加mod其实就是在每个括号里加上取mod。代码也很简短。

public class Solution {
    private int powmod(int a, int b, int mod) {
        int ans = 1;
        for (int i = 0; i < b; i++) {
            ans = (ans*a)%mod;
        }
        return ans;
    }
    public int superPow(int a, int[] b) {
        int ans = 1;
        a %= 1337; //开始没加这行,被大数坑了一次
        for (int i = 0; i < b.length; i++) {
            ans = (powmod(ans,10,1337)*powmod(a, b[i], 1337)) % 1337;
        }
        return ans;
    }
    public static void main(String args[]) {
        Solution s = new Solution();
        int a = 121;
        int[] b = {14,4,2,582,2,2,3,6};
        int ans = s.superPow(a, b);
        System.out.println(ans);
    }
}
目录
相关文章
|
7月前
|
算法
Leetcode 313. Super Ugly Number
题目翻译成中文是『超级丑数』,啥叫丑数?丑数就是素因子只有2,3,5的数,7 14 21不是丑数,因为他们都有7这个素数。 这里的超级丑数只是对丑数的一个扩展,超级丑数的素因子不再仅限于2 3 5,而是由题目给定一个素数数组。与朴素丑数算法相比,只是将素因子变了而已,解法还是和朴素丑数一致的。
73 1
|
12月前
|
算法 安全 Swift
LeetCode - #50 Pow(x, n)
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
LeetCode 372. Super Pow
你的任务是计算 ab 对 1337 取模,a 是一个正整数,b 是一个非常大的正整数且会以数组形式给出。
54 0
LeetCode 372. Super Pow
|
存储
LeetCode 313. Super Ugly Number
编写一段程序来查找第 n 个超级丑数。 超级丑数是指其所有质因数都是长度为 k 的质数列表 primes 中的正整数。
76 0
LeetCode 313. Super Ugly Number
LeetCode 50. Pow(x, n)
实现pow(x,n),即计算x的n次方
66 0
LeetCode 50. Pow(x, n)
|
存储 机器学习/深度学习 算法
LeetCode 49字母异位词分组&50pow(x,n)&51八皇后
给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
107 0
LeetCode 49字母异位词分组&50pow(x,n)&51八皇后
|
算法 Java Python
ACM 选手图解 LeetCode Pow(x,n)
ACM 选手图解 LeetCode Pow(x,n)
ACM 选手图解 LeetCode Pow(x,n)
|
算法 Java C++
LeetCode(算法)- 50. Pow(x, n)
LeetCode(算法)- 50. Pow(x, n)
144 0
LeetCode(算法)- 50. Pow(x, n)
|
14天前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-2
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题