题目:

Your task is to calculate a^b 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次方mod 1337,其中b是一个extremely large的数,以至于需要用整数数组来存储。

引理:(a × b)mod M = ((a mod M) * (b mod M)) mod M

证明:

若 a = x·M + m, b = y·M + n

(a × b) mod M = (xyMM + myM + nxM + mn) mod M

其中 xyMM, myM, nxM 均能被M整除,故

(a × b) mod M = mn mod M

解题思路:

百度来基本解题思路均为二分,将b作为数字处理。相关链接:http://blog.csdn.net/mebiuw/article/details/51853673

可能我的思路比较特殊,当然方法也比较复杂,但是理论上复杂度应该更低。

举个例子,若b是一个5位数,b = A*1000 + B*1000 + C*100  + D*10 + E

注意到,a^b = a^(A*10000 + B*1000 + C*100  + D*10 + E) = (a^10000)^A + (a^1000)^B + (a^100)^C + (a^10)^D + (a^1)^E

可以利用一个与b等长的数组把a^(10^n)存储下来,之后每次可以直接拿过来用。因为 a^n mod M = ((a^(n/2) mod M) * (a^(n/2) mod M)) mod M, 所以这里可以使用上述引理,执行二分策略。

而对于每一个 a^(10^i)^bi, 又可以看做 ai ^ bi, 这里依旧可以利用引理进行二分。

AC代码如下:

public final int MOD = 1337;
public int modProd(int x, int y){
return ((x%MOD)*(y%MOD))%MOD;
}
public int pow(int a, int b){
// return (a^b)%MOD
if (b == 0) return 1;
if (b == 1) return a%MOD;
int m = pow(a, b/2);
if (b%2 == 1){
return modProd(a, m*m);
}else{
return modProd(m, m);
}
}
public int superPow(int a, int[] b) {
int[] mpow = new int[b.length];
int i, j;
for (i = 0, j = b.length-1; i < j; i++, j--){
// b 中高低位交换,便于后续编码
b[i] = b[i] ^ b[j];
b[j] = b[i] ^ b[j];
b[i] = b[i] ^ b[j];
}
mpow[0] = a%MOD;
for (i = 1; i< b.length; i++){
// 预处理,存储 (a^(10^i)) mod M
// 预处理过程中,对于 a^(10^i)看做 a^(10^(i-1)) ^ 10, 这样每次只需要运行 log 10 次
mpow[i] = pow(mpow[i-1], 10);
}
int res = 1;
for (i = 0; i< b.length; i++){
// 对每一位 bi 计算 a^(bi*(10^i))
res = modProd(res, pow(mpow[i], b[i]));
} return res;
}

预处理阶段,计算 a^(10^i) mod M, 由于每次是提取前一次的结果作为基数,故每次需要4次,预处理的时间复杂度为 4·|b|,其中|b|为字符串b的长度。

运行阶段,每次运行也是最多4次,故其复杂度为 4·|b|。

整个程序运行复杂度为 O(8·|b|)

而对于其他解法,其每次二分均需要对b进行一次处理,故其复杂度为 O(|b|×log(Valueof(b))),其中Valueof(b)表示数组b所代表的值,它将远远大于 |b|。

LeetCode 372的更多相关文章

  1. C#版(击败100.00%的提交) - Leetcode 372. 超级次方 - 题解

    版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. Leetcod ...

  2. LeetCode——372. Super Pow

    题目链接:https://leetcode.com/problems/super-pow/description/ Your task is to calculate ab mod 1337 wher ...

  3. Java实现 LeetCode 372 超级次方

    372. 超级次方 你的任务是计算 ab 对 1337 取模,a 是一个正整数,b 是一个非常大的正整数且会以数组形式给出. 示例 1: 输入: a = 2, b = [3] 输出: 8 示例 2: ...

  4. Leetcode 372. Super Pow

    使用公式 c = ab  =>  c mod d = [a mod d * b mod d] mod d 所以a^423 mod d = (a^100)^4 * (a ^10)^2 * a^3 ...

  5. Leetcode 372.超级次方

    超级次方 你的任务是计算 ab 对 1337 取模,a 是一个正整数,b 是一个非常大的正整数且会以数组形式给出. 示例 1: 输入: a = 2, b = [3] 输出: 8 示例 2: 输入: a ...

  6. leetcode & lintcode for bug-free

    刷题备忘录,for bug-free leetcode 396. Rotate Function 题意: Given an array of integers A and let n to be it ...

  7. leetcode & lintcode 题解

    刷题备忘录,for bug-free 招行面试题--求无序数组最长连续序列的长度,这里连续指的是值连续--间隔为1,并不是数值的位置连续 问题: 给出一个未排序的整数数组,找出最长的连续元素序列的长度 ...

  8. [LintCode]——目录

    Yet Another Source Code for LintCode Current Status : 232AC / 289ALL in Language C++, Up to date (20 ...

  9. leetcode 50. Pow(x, n) 、372. Super Pow

    50. Pow(x, n) 372. Super Pow https://www.cnblogs.com/grandyang/p/5651982.html https://www.jianshu.co ...

随机推荐

  1. C#-WinForm-Winform TextBox中只能输入数字的几种常用方法(C#)

    方法一: private void tBox_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == 0x20) e.KeyCh ...

  2. jsp如何自定义tag的标签库?

    虽然和上一次的使用自定义的tld标签简化jsp的繁琐操作的有点不同,但是目的也是一致的.自定义tag比较简单. 1.新建tag标签 在WEB-INF目录下新建一个tags的文件夹,是自定义tag标签的 ...

  3. mogodb3.2源码安装

    mogodb3.2源码安装 下载链接: http://www.mongodb.org/downloads 1.环境准备: 1.mkdir -p /data/tgz #创建存放软件的目录 2.mkdir ...

  4. hosts manager——hosts配置管理工具

    引言 做web开发相关的经常会用到hosts修改的功能,各个平台好像都有hosts 配置GUI(据我所知windows有.MAC OX也有),但是命令行配置hosts的好像还没有,命令行配置的话有几个 ...

  5. ckeditor+angularjs directive

    var cmsPlus = angular.module('cmsPlus', []); cmsPlus.directive('ckEditor', function() { return { req ...

  6. 搭建spring mvc项目

    在之前搭建maven项目这篇的基础上继续集成,引入spring mvc支持 一.添加jar包引用 修改pom.xml文件,加入:(其他关联的jar包maven会自动引用) <!-- 项目属性 - ...

  7. Nginx简易配置文件(一)(静态页面及PHP页面解析)

    user nobody nobody; worker_processes 4; error_log logs/error.log; pid logs/nginx.pid; events { use e ...

  8. 深度分析mysql GROUP BY 与 ORDER BY

    鉴于项目的需要,就从网上找到该文章,文章分析得很详细也很易懂,在android里,(不知道是不是现在水平的限制,总之我还没找到在用ContentProvider时可以使用子查询),主要方法是用SQLi ...

  9. php常用字符串函数小结

    php内置了98个字符串函数(除了基于正则表达式的函数,正则表达式在此不在讨论范围),能够处理字符串中能遇到的每一个方面内容,本文对常用字符串函数进行简单的小结,主要包含以下8部分:1.确定字符串长度 ...

  10. 11月3日上午PHP练习《投票》

    1.建立数据库 表1:DiaoYanTiMu 表2:DiaoYanXuanXiang 2.页面 页面1:投票首页 <!DOCTYPE html PUBLIC "-//W3C//DTD ...