a^b%p and a*b%p快速幂

Posted dongdong25800

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了a^b%p and a*b%p快速幂相关的知识,希望对你有一定的参考价值。

#include<cstdio>
int power(int a, int b, int p)
{
    int ans=1%p;
    for(;b;b>>=1)
    {
        if(b&1) ans=(long long)ans*a%p; 
        a=(long long)a*a%p;
    }
    return ans;
}
int main()
{
    int a,b,c;
    scanf("%d%d%d", &a, &b, &c);
    printf("%d^%d mod %d=%d", a,b,c,power(a,b,c));
}

这就是快速幂模板吧,求a^b,其中1<=a,b<=10^9。

解法就是将b看成是二进制下的数,这样a^b就转化成a^(b的每一个二进制1对应的十进制数)比如b二进制为1111时,a^b=a^(1+2+4+8)=a^1*a^2*a^4*a^8,就这样拆分了。其中循环语句就是从低位到高位,从左到右判断b是否存在一个1,存在的话就乘以一个对应改二进制下的a。时间复杂度为o(log2 b)。

因为两个int相乘可能会超过int表示范围,所以long long运算后在强制转化为int。

 

 

求a*b%p, 其中1<=a,b,p<=10^18。

类似于快速幂,将b看为二进制数进行计算,例如当b二进制=1111时,a*b=a*(1+2+4+8)=a*1+a*2+a*4+a*8。时间复杂度为o(log 2 b)。

#include<cstdio>
long long mul(long long a, long long b, long long p)
{
    long long ans=0;
    for(; b; b>>=1)
    {
        if(b&1) ans = (ans+a)%p;
        a=a*2%p;
    }
}
int main()
{
    long long a,b,p;
    scanf("%lld%lld%lld", &a, &b, &p);
}

 

以上是关于a^b%p and a*b%p快速幂的主要内容,如果未能解决你的问题,请参考以下文章

快速幂+大数取模

快速幂+大数取模

快速幂模板

快速幂与矩阵快速幂

取模性质,快速幂,快速乘,gcd和最小公倍数

快速幂