快速幂基本模板
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 模板矩阵加速(数列)