最近用的快速幂比较多...所以写点简单的理解吧。
最常见的对于求x^n
最基本的方法就是
int ans=1;
for (int i=0;i<n;i++)
ans=(ans*x)%MOD;
cout<<ans<<endl;
而显然,当n较大的时候这个O(n)的算法会超时。
所以这个时候就需要快速幂了。
快速幂的原理就是二进制,只在n的二进制位为1的位置上做一次乘法
因为对一个n的二进制换算成十进制时,我们只在1的位置上做一次阶乘求和
比如对数字10,
二进制是1010
我们的换算方式则是0*2^0+1*2^1+0*2^2+1*2^3=2^1+2^3
这时候我们可以考虑一点,如果是求x^10
那么不是只要求x^(2^1)*x^(2^3)就可以了吗?
这是我的理解方式.....一种通俗的理解方法,代码非常简单,不管是作为模板还是直接背下来,或者是理解之后去使用,都非常方便~
当然,快速幂还有一个进阶版的算法叫做矩阵快速幂~等我彻底理解之后再来写吧~
#include <stdio.h>
#include <math.h>
#define MOD 1000000007
long long find(int x,int n)
{
long long a=x;
long long ans=1;
while (n)
{
if (n&1) ans=ans*a%MOD;
a=a*a%MOD;
n>>=1;//效果跟n/=2;一样
}
return ans;
}
int main()
{
int n,x;
while (~scanf("%d%d",&n,&x))
{
printf("%lld\n",find(x,n));
}
}