快速幂取余算法

求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

//方法一:递归
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);
}

你可能感兴趣的:(快速幂取余算法)