快速幂 快速幂取模
1.快速幂
快速幂的运算用到了之前求出的结果;可以减小循环次数,达到快速幂的效果;
代码实现
int a,n;
scanf("%d%d",&a,&n);
int ans=1,base=a;
while(n!=0)
{
if(n&1==1)
ans=ans*base;
base=base*base;
n=n>>1;
}
注意:
符号& 按位与, 如果两个相应的二进制位都为1,则该位的结果值为1,否则为0;
例如 5和3
. 5 0000 0101
. 3 0000 0011
得 0000 0001
5&3=1;
n&1可以判断n的奇偶性;
符号 >> 将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0;
n>>1 (相当于n=n/2)
2.快速幂取模
快速幂取模运用了一个公式
(a*b) mod c = ((a mod c)*(b mod c)) mod c
代码实现
int a,n,c;
scanf("%d%d",&a,&n,&c);
int ans=1,base=a%c;
while(n!=0)
{
if(n&1==1)
ans=(ans * base)%c;
base=(base*base)%c;
n=n>>1;
}
有的人曾经问我 为什么不快速幂结束之后再取模?
因为在求幂的过程中,数据可能会很大,就可能会超限;
所以要在求幂过程中取模。