求a的m次方然后除以t
常规想法是如下
int f=1;
for(int i=1;i<=m;i++){
f=f*a;
}
f=f%t;
1.容易时间超时,效率低下,快速幂的算法便是提高效率,缩短时间。
2.若a和m较大时容易溢出,若在每次进行次方运算前将所要运算的数取余,则会减少溢出的可能。
运用公式:
(a^m)%t=((a%t)^m)%t 既在每次进行次方运算前(快速幂运算)将所要运算的数取余。
思想和快速幂一样。
#include<stdio.h>
//方法一:递归
int power1(int a,int m,int d){
int f;
if(m==0) return 1;
if(m==1) return a%d;
else {
f=power1(a,m>>1,d);
f=f*f%d;
if(m&1==1){ //若m为奇数
f=f*a%d;
}
return f;
}
}
//方法二:飞递归
int power2(int a,int m,int d){
int f=1;
while(m>0){
if(m&1==1){
f=f*a%d;
}
a=a*a%d;
m>>=1;
}
return f;
}
int main(){
int m,a,c,d;
scanf("%d%d%d",&a,&m,&d);
c=power1(a,m,d);
printf("%d",c);
}