【快速幂】

来源:互联网 发布:大数据时代影响 编辑:程序博客网 时间:2024/06/17 07:54

一、快速幂取模

/******快速幂取模******/int f(int a,int b,int n){    int t,y;    t=1;    y=a;    while(b!=0)    {        if(b&1==1)        {            t=t*y%n;        }        y=y*y%n;        b=b>>1;    }    return t;}int main(){    int a,b,n;    while(scanf("%d%d%d",&a,&b,&n)!=EOF)    {        printf("%d\n",f(a,b,n));    }    return 0;}

二、幂取模

/********幂取模*******/int pow_mod1(int a,int n,int m)  //O(n);{    int ans=1;    for(int i=0;i<n;i++)    {        ans=(int)((long long)ans*a%m);    }    return ans;}int pow_mod2(int a,int n,int m)  //O(logn),类似二分的分治法,递归;{    if(n==0)        return 1;    int x=pow_mod2(a,n/2,m);    long long ans=(long long )x*x%m;    if(n%2==1)        ans=ans*a%m;    return (int)ans;}int main(){    int a,n,x;    while(scanf("%d%d%d",&a,&n,&x)!=EOF)    {        printf("pow_mod1():");        printf("%d\n",pow_mod1(a,n,x));        printf("pow_mod2():");        printf("%d\n",pow_mod2(a,n,x));    }    return 0;}

三、求幂

/******二分求幂******/int pow4(int a,int b){      int r=1,base=a;    while(b!=0)    {//        printf("b:%d\n",b);        if(b&1)        {//            printf("b:%d\n",b);            r*=base;//            printf("r:%d\n",r);        }        base*=base;//        printf("base:%d\n",base);        b>>=1;//        printf("b:%d\n",b);    }    return r;}int main(){    int a,b;    while(scanf("%d%d",&a,&b)!=EOF)        printf("%d\n",pow4(a,b));    return 0;}

/*****快速求幂******/int pow3(int x,int n){    if(n==0)        return 1;    else    {        while((n&1)==0)        {            n>>=1;//            printf("n:%d\n",n);            x*=x;//            printf("x:%d\n",x);        }    }//    printf("***\n");    int result=x;//    printf("result:%d\n",result);//    printf("***\n");    n>>=1;//    printf("n:%d\n",n);    while(n!=0)    {        x*=x;//        printf("x:%d\n",x);        if((n&1)!=0)        {            result*=x;//            printf("result:%d\n",result);        }        n>>=1;//        printf("n:%d\n",n);    }    return result;}int main(){    int a,b;    while(scanf("%d%d",&a,&b)!=EOF)        printf("%d\n",pow3(a,b));    return 0;}

/***内容来自小白书和百度百科快速幂***/


0 0
原创粉丝点击