• 题目描述:
  • 你的任务是计算 ab 对 1337 取模,a 是一个正整数,b 是一个非常大的正整数且会以数组形式给出

  • 示例
  • 输入:a = 2, b = [3]
    输出:8
    输入:a = 2147483647, b = [2,0,0]
    输出:1198

  • 解析:这是一个看起来很简单,实质上很复杂的题目,前提是如果你知道余数定理和快速幂的话,如果不知道这就是一个很难的题目了。再将余数定理之前,先说一下快速幂,这题就是快速幂+余数定理的结合。
  • 先说说快速幂的问题,讲快速幂之前先说一说分治的思想。比如我们要算5234的值,如果我们直接算234个5相乘,计算次数是很多的,是235次,但是我们可以采用分治的思想,比如234可以拆解成2100+310+4,那么5234=52*100+3*10+4=52*100*53*10*54,这样幂的次数就降低了很多,关于原来的式子还可以进一步分治,将每次的幂分解为10以内的式子,如52*100= ((52)10)10,以此类推,从而将每个幂将为10以内的数字,来减少运算次数,分治之后我们的计算次数为3+2+1=6次,可见运算次数大大减少。实际中的快速幂为了方便运算,采用了更为简单的二分思路。即如果我还是要算5234,计算过程如下
  • 5234=5234/2*5234/2=5117*5117
    5117=5117-1*5 (117为基数,因此要拆解为an=an-1*a)
    5116=5116/2* 5116/2
    …以此类推

  • 到这里就很明显了,实际中的快速幂大多采用递归的方式进行运算,将O(n)的时间复杂度降低为了O(log n)的时间复杂度。
  • 余数定理主要有三个
  • 1-余数的加法定理:a与b的和除以c的余数,等于a,b分别除以c的余数之和,或这个和除以c的余数(如果余数之和大于c),即(a+b)%c = (a%c+b%c)%c。

  • 2-余数的乘法定理:a与b的乘积除以c的余数,等于a,b分别除以c的余数的积,或者这个积除以c所得的余数(如果余数之积大于c),即(a*b)%c = (a%c*b%c)%c,这里有一个特例,如果a=b,那么(a*b)%c =((a%c)2)%c,假设a%b=c那么,就有(am)%b=(cm)%b,这个公式就是解决这道题的关键

  • 若两个数a,b除以同一个数m得到的余数相同,则a,b的差一定能被m整除。这个就简单提一下,本题用不到。

  • 代码如下:
class Solution:def superPow(self, a: int, b: List[int]) -> int:"""计算a的b次幂对1337取模,b以数组的形式给出>>>self.superPow(2, [1, 0])>>>1024"""res = 1for i in b:res = res%1337res = (res**10)*(a**i)return res%1337
  • 代码解读,本例用了快速幂的思想和余数定理的第二条,再每一次对res进行整体幂运算的时候对res进行取余,因为res%1337等价于(res10)%1337。

leetcode刷题日记- 超级次方相关推荐

  1. 一个算法笨蛋的12月leetCode刷题日记

    类似文章 一个算法笨蛋的2021年11月leetCode刷题日记 一个算法笨蛋的2021年12月leetCode刷题日记 一个算法笨蛋的2022年1月leetCode刷题日记 一个算法笨蛋的2022年 ...

  2. Leetcode刷题日记(十二)

    又是老台词:欢迎大家来到一晚一度的leetcode刷题日记时间.今天我们来讲讲队列的问题,队列这方面的基础知识需要的同学到博主前面的文章找吧.队列这方面的问题平时博主也是接触得比较少的.下面是一道利用 ...

  3. Leetcode刷题日记:21-25题篇

    Leetcode刷题日记:21-25题篇 简介 题目: 21. 合并两个有序链表 22. 括号生成 23. 合并K个升序链表 24. 两两交换链表中的节点 25. K 个一组翻转链表 注 简介 这个系 ...

  4. 【LeetCode刷题日记】常用算法基础和理解及运用

    在我们LeetCode刷题过程中,如果我们只是了解数据结构(数组,链表,数)的使用方法,那我们在面对复杂的题目时,是很难很好的解决问题的,因此我们要了解一些常用算法来帮助我们更好的解题. 递归和迭代 ...

  5. leetcode刷题日记(一)—— 数组

    因为暑期实习找得很不顺利,感觉自身最大的问题体现在刷题量偏少,操作系统,数据库基础不好,所以现在决定写博客来记录整个过程,希望能找到大厂offer,如果不能找到的话也算是为秋招做准备. 剑指offer ...

  6. [东哥的leetcode刷题日记] leetcode 278 :First Bad Version

    leetcode 278 :First Bad Version 题目链接: https://leetcode-cn.com/problems/search-insert-position/ 难度: 简 ...

  7. LeetCode刷题日记盛最多水的容器

    节后第一天,鉴于五一五天都没做过题,有点遗忘了,今天来看一道简单点的题,练下手. 先看下题: 给你 n 个非负整数 a1,a2,-,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条 ...

  8. 石器时代 —— Leetcode刷题日记 (一 百大热题)

    Date: 2019.10.22 - (C++ Version) 文章目录 All Labels: `热题100` L1 两数之和 L2 两数相加 暴力相加 递归 迭代 L3 无重复字符的最长子串 L ...

  9. [东哥的leetcode刷题日记] leetcode 283 : Move Zeroes

    leetcode 283 : Move Zeroes 题目链接: https://leetcode-cn.com/problems/move-zeroes/ 难度: 简单 归类 : 数组操作 题目: ...

  10. LeetCode刷题日记精选例题(解析+代码+链接)

    文章目录 一.用栈模拟队列 二.用队列模拟栈 三.有效的括号 解法一 解法二 四.删除字符串中所有相邻重复项 五.逆波兰表达式求值 六.滑动窗口最大值 七.前k个高频元素 一.用栈模拟队列 因为队列先 ...

最新文章

  1. 给python点颜色青少年学编程_早晨送给自己的句子,句句经典励志!
  2. 数据挖掘公司D square nv 完成500万欧元B轮融资
  3. 指定python 版本安装相关插件
  4. python文件的读取和写入
  5. IC攻城狮求职宝典 01 2018年IC设计企业 笔试题 01 英伟达(Nvidia)
  6. 计算机排版技能会操方案,实验九 Word的高级排版技巧.pdf
  7. 默认适应窗口_PS教程基础之cs6默认快捷键汇总及补充
  8. this指向_js中关于this指向的训练题
  9. ProtoBuf生成EmmyLua注解API提示文件(支持复杂的嵌套结构)
  10. 英语口语练习软件测试简历,软件测试工程师个人简历英文版
  11. python绘画海贼王_Python爬虫之爬取海贼王全彩漫画图片
  12. Java程序员的薪资取决于工作年限还是技术?
  13. 鼓励参与计算机考试宣传标语,考试宣传标语34句
  14. 路飞学院 python_路飞学院-Python爬虫实战密训班-第1章
  15. 通过路由器绕过DDoS防御攻击web服务器总结
  16. mysql selecte_【mysql】MySQL eplain 完全解读
  17. CATT eCATT {转载}
  18. mysql meb_教你如何恢复使用MEB备份的MySQL数据库
  19. CTF~ImageMagick+gaps=自动拼图
  20. 屏幕一直显示android,lenovo!屏幕一直显示poweredbyandroid是什么意思

热门文章

  1. python对于一元线性回归模型_Python|机器学习-一元线性回归
  2. HP02: ssh: Could not resolve hostname hp02: Name or service not known HP01: ssh: Could not resolve h
  3. vba 自动排序_Excel表格自动排序,神了!
  4. pcb过孔漏铜_使用Proteus设计自己的PCB | 入门简易教程
  5. 书生浏览器不能打开这个文件或者url_这些浏览器工作原理你都吃透了吗?
  6. 电大考计算机和英语,2016年电大+年电大计算机_英语_网考小抄.doc
  7. 加密+拜占庭将军_简单读懂拜占庭容错
  8. js里面把密码encode_Python实战案例:这是你见过的最详细的JS加密登录某博
  9. 深度学习笔记_基本概念_神经网络中的epoch、batch_size和iteration
  10. Java 关于类型类、this.getClass()的理解