一般的求一个数的n次方是这样的:
typedef long long ll;
#define MOD 10000007
ll POW(ll x,ll n){
ll i=1;
ll result=1;
while(i<=n){
result=(result*x)%MOD;//要不要取余看情况,一般是要的不然数据太大会超出long lon的数据范围
i++;
}
return result;
}
这种方法虽然很简单易懂但它的复杂度为log(n),还可以再简化。
像这样:
typedef long long ll;
#define MOD 10000007
ll quick_pow(ll x,ll n){
ll result = 1;
ll cnt = x;
while(n){
if(n & 1){
result=(cnt*result)%MOD;//要不要取余看情况,一般是要的不然数据太大会超出long long的数据范围
}
n>>=1;
cnt=(cnt*cnt)%MOD;
}
return result;
}
这样的方法的时间复杂度是log(n);
原理:
xn = x20+21+22+…+2k = x20 * x21 * x22 * …* x2k
其中 20+21+22+…+2k = n;
这段代码就可以实现上面的功能:
while(n){
if(n & 1){//判断低位是否是1
result*=cnt;
}
n>>=1;//去除低位
cnt*=cnt;//每执行一次cnt的次方加一
}
return result;