二分快速幂-题型归纳与总结

简介: 二分快速幂-题型归纳与总结

一、概念

二分快速幂

二、模板

请看例题2

三、例题

题:50. Pow(x, n)

实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,x^n^ )。

示例 1:

输入:x = 2.00000, n = 10
输出:1024.00000

示例 2:

输入:x = 2.10000, n = 3
输出:9.26100

示例 3:

输入:x = 2.00000, n = -2
输出:0.25000
解释:2-2 = 1/22 = 1/4 = 0.25

提示:

-100.0 < x < 100.0
-231 <= n <= 231-1
-104 <= xn <= 104    

解:

解题思路:快速幂

快速幂(二进制解析):

对于一个任何十进制正整数 n ,设其二进制为:“bm...b2b1”

二进制转十进制:

$$ n=2^0*b_1+2^1*b_2+\cdot \cdot \cdot +2^{m-1}*b_m $$幂的二进制展开: $$

x^n=x^{2^0b_1+2^1b_2+\cdot \cdot \cdot +2^{m-1}b_m}=x^{2^0b_1}x^{2^1*b_2}\cdot \cdot \cdot x^{2^{m-1}}

$$ *** **快速幂(二分推导):** $$

x^n=\left{ \begin{array}{l} \left( x^2 \right) ^{n/2},\ n\text{为偶数}\\ x\left( x^2 \right) ^{n/2},\ n\text{为奇数}\\ \end{array} \right.

$$ *** AC代码: ```java class Solution { public double myPow(double x, int n) { if(x == 0.0f) return 0.0d; // 底数为0 long b = n; // 防止负数转正数溢出 if(b < 0) { b = -b; x = 1/x; } double res = 1.0; while(b > 0) { if((b & 1) != 0) res *= x; x *= x; b >>= 1; } return res; } } ``` ## 题:372. 超级次方 你的任务是计算 ab 对 1337 取模,a 是一个正整数,b 是一个非常大的正整数且会以数组形式给出。 示例 1: 输入:a = 2, b = [3] 输出:8 示例 2: 输入:a = 2, b = [1,0] 输出:1024 示例 3: 输入:a = 1, b = [4,3,3,8,5,2] 输出:1 示例 4: 输入:a = 2147483647, b = [2,0,0] 输出:1198 提示: 1 <= a <= 231 - 1 1 <= b.length <= 2000 0 <= b[i] <= 9 b 不含前导 0 ## 解: 解题思路:`快速幂` 例子: 0. a^K^ = 99^2345^ 1. 99^K^ = 99^234*10+5^ 2. 99^234*10+5^ = 99^234*10^ * 99^5^ 3. 99^234*10^ * 99^5^ = (99^234^)^10^ * 99^5^ AC代码: ```java class Solution { int MOD = 1337; public int superPow(int a, int[] b) { return dfs(a, b, b.length - 1); } int dfs(int a, int[] b, int u) { if(u == -1) return 1; return qpow(dfs(a, b, u - 1), 10) * qpow(a, b[u]) % MOD; } // 快速幂 int qpow(int a, int b) { int ans = 1; a %= MOD; while(b > 0) { if((b & 1) != 0) ans = ans * a % MOD; a = a * a % MOD; b >>= 1; } return ans; } } ```

相关文章
|
2月前
|
算法 测试技术 索引
动态规划算法练习题
动态规划算法练习题
24 0
|
5月前
|
存储
【题型总结】数位dp(一)
【题型总结】数位dp(一)
47 0
|
5月前
|
存储 网络架构
【题型总结】数位dp(二)
【题型总结】数位dp(二)
42 0
|
5月前
|
算法 C++
一题带你写出图论算法模板!!!
一题带你写出图论算法模板!!!
|
6月前
|
算法 C++
C++基础算法二分篇
C++基础算法二分篇
|
8月前
|
算法
每日刷题|回溯法解决组合问题
每日刷题|回溯法解决组合问题
|
10月前
|
算法
算法 - 蓝桥杯并查集题型
算法 - 蓝桥杯并查集题型
|
人工智能 算法 C++
[**算法**]关于数字反转的两道例题的分析思考
两个题目看着很像,但是细节不太一样,一个是去处理浮点,(其中有用STL大法的和将小数点前后和小数点分开进行输入的还有利用字符串的读写来处理的)还有一个是去处理整数
112 0
|
算法 Java Linux
【基础算法】二分例题(我在哪?)
【基础算法】二分例题(我在哪?)
93 0
【基础算法】二分例题(我在哪?)