以下以求a的b次方来介绍[1]
把b转换成二进制数。
该二进制数第i位的权为
例如
11的二进制是1011
11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1
因此,我们将a¹¹转化为算
__int64 pow3(inta,intb)//快速幂
{
__Int64
r=1,base=a;
while(b)
{
if(b&1)
r*=base;
base*=base;
b>>=1;//①
}
return
r;
}
__int64
qpow(int a,int b,int c)
{
__int64 r=1,base=a;
while(b)
{
if(b&1)
r=(r*base)%c;//②
base=(base*base)%c;
b>>=1;
}
return r%c;
}
①
>> 右移 将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0
②
r*=base%c;//这是错误的写法,不能对快速幂求模的公式直接加上%r,*=注意
③
快速幂取模思想: a*b mod c= ((a mod c) *b) mod c
时间: 2024-10-25 20:09:04