先贴代码
typedef long long ll;
ll quickpow(ll x,ll n,ll mod){
ll res=1;
while(n>0){
if(n&1) res=res*x%mod;//如果b的二进制下最右边为1
x=x*x%mod;//更新x
n>>1;//
}
return res;
}
要求a^b,本来要O(b)的复杂度,但是根据一条我不知道的数论,先把b看成二进制,然后就是求a的二进制下的b。
比如上面,x的22次方,22在二进制下是10110,对应的就是2的1次方,2的平方,2的4次方,也就是求x的2次方乘x的四次方乘x的16次方。