快速幂
#include<bits/stdc++.h>
using namespace std;
int Quick_pow(int a,int b)
{
int ans=1,base=a;// ans:结果;base:底数
while(b)
{
if(b & 1)//等于b%2==1
{
ans=ans*base;
}
base=base*base;
b = b >> 1;//等于b/2
}
return ans;
}
int main()
{
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",Quick_pow(a,b));
}
原理:
仔细观察可以发现:指数b是可以拆成二进制形式的。
例如,当b=11时,b的二进制为1011,即1×20+1×21+1×23
那么a11=a1×a2×a8
经过上述操作,要求a11我们只需要进行3次计算,而用朴素算法需要进行11次计算。
接着就是如何判断一个数在二进制形式的某个位置是0还是1即可
快速幂取模:
time:O(logN)
int pow_mod(int a,int b,int c)
{
int ans = 1,base=a;// ans:结果 base:底数
base = base % c;
if(b==0)//0次方
{
return 1%c;
}
while(b)
{
if(b & 1) //判断奇偶
ans = (ans*base) % c; //取模
b = b >> 1;// 等于除2
base = (base * base) % c; //取模
}
return ans;
}
原理:
快速幂取模算法依赖于以下公式:
abmod c=((a2)b/2)mod c(b是偶数)
abmod c=((a2)b/2×a)mod c(b是奇数)
快速幂算法通过将指数转化为二进制形式,显著减少了计算次数。例如,求a的11次方只需3次计算,而非朴素算法的11次。算法分为取模为偶数和奇数两种情况,利用公式abmod c = ((a2)b/2)mod c (b为偶数) 或 abmod c = ((a2)b/2×a)mod c (b为奇数),实现高效运算。

1820

被折叠的 条评论
为什么被折叠?



