快速幂基本模板

Posted mpeter

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速幂基本模板相关的知识,希望对你有一定的参考价值。

快速幂,二进制思想,结合位运算使时间复杂度达到了O(logn)。

如,设运算一个二进制为a^b, a为底数(不为0),b为幂数。

若b = 14。

b 的二进制代码为 14 -> 1 1 1 0 -> 2^3 + 2^2 + 2^1 + 0 = 14。

这样, 我们就可以将a^14拆成了a^8  * a^4 * a^2 * 1。

那么问题来了,如何实现呢?

很简单,运用位运算,b&1 == 1 时进行乘法运算, 否则底数底数自乘达到自增的目的,而后 b >>= 1向后移一位直到b == 0返回答案ans

下面上代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #define ll long long
 4 
 5 using namespace std;
 6 //快速幂主体
 7 ll poww(ll a, ll b)
 8 {
 9     ll ans = 1, base = a;
10     while(b != 0)
11     {
12         if(b&1 != 0)
13             ans *= base; //实际上就是二进制思想,最末尾为1则乘底数的n-1次方,模拟。
14         base *= base;
15         b >>= 1;
16     }
17     return ans;
18 }
19 
20 int main()
21 {
22     int T;
23     scanf("%d", &T);
24     while(T--)
25     {
26         ll n, a; scanf("%lld%lld", &n, &a);
27         ll ans;
28         ans = poww(n, a);
29         printf("%lld
", ans);
30     }
31     return 0;
32 }
33 #include <iostream>
34 #include <cstdio>
35 #define ll long long
36 
37 using namespace std;
38 //快速幂主体
39 ll poww(ll a, ll b)
40 {
41     ll ans = 1, base = a;
42     while(b != 0)
43     {
44         if(b&1 != 0)
45             ans *= base; //实际上就是二进制思想,最末尾为1则乘底数的n-1次方,模拟。
46         base *= base;
47         b >>= 1;
48     }
49     return ans;
50 }
51 
52 int main()
53 {
54     int T;
55     scanf("%d", &T);
56     while(T--)
57     {
58         ll n, a; scanf("%lld%lld", &n, &a);
59         ll ans;
60         ans = poww(n, a);
61         printf("%lld
", ans);
62     }
63     return 0;
64 }

如有错误,欢迎评论指正!

以上是关于快速幂基本模板的主要内容,如果未能解决你的问题,请参考以下文章

Luogu P3390 模板矩阵快速幂&&P1939 模板矩阵加速(数列)

模板之矩阵快速幂(luogu P3390模板矩阵快速幂)

[每日一题2020.06.15]P1226 模板快速幂取余运算

快速幂模板

51nod1113(矩阵快速幂模板)

数论——快速幂,模运算及快速幂求逆元