幂取模

版权声明:个人笔记,仅供复习 https://blog.csdn.net/weixin_42373330/article/details/82839057

描述:

输入正整数a,n和m,输出a^{n}mod m的值。a,n,m<=1e9。

分析:

很容易写出下面的代码:

int pow_mod(int a,int n,int m)
{
    int ans=1;
    for(int i=0;i<ans;i++) ans=(int)((long long )ans*n%m);
}

接下来可以用分治法优化上面的代码:

#include <stdio.h>
#include <string.h>
int pow_mod(int a,int n,int m)
{
    if(n==0) return 1;
    int x=pow_mod(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()
{
    printf("%d\n",pow_mod(2,3,5));
    return 0;
}

例如,a^{29}=(a^{14})^{2}Xa(a^{14})^{2}\times a,而a^{14}\mathit{= (a^{7})^{2}},a^{7}= (a^{3})^{2}\times a,a^{3}= a^{2}\times a,一共只用了7次乘法。这个与快速幂的算法是一样的

猜你喜欢

转载自blog.csdn.net/weixin_42373330/article/details/82839057