快速乘/快速冪

G_M_R_發表於2020-12-06

為什麼要用快速乘/快速冪

快速冪

傳統的求冪演算法時間複雜度非常高(為O(指數n)),因為當指數n非常大的時候,需要執行的迴圈操作次數也非常大,而快速冪能幫我們以相對更少的時間算出指數非常大的冪。

快速乘

加法比乘法快。可以用較多的加法來取代乘法來減少時間複雜度(乘法分配律?)

原理

見:https://blog.csdn.net/maxichu/article/details/45459715
(絕不承認自己懶)

模板

#include<stdio.h>
#define LL long long
LL mul_mod(LL a,LL b,LL c)   //a*b mod c
{
    LL ans=0;
    while(b)
    {
        if(b%2)
            ans=(ans+a)%c;
        a=(a+a)%c;
        b/=2;
    }
    return ans;
}
LL pow_mod(LL a,LL b,LL c)   //a^b mod c
{
    LL res=1;
    a=a%c;
    while(b)
    {
        if(b%2)
            res=(res*a)%c;  //res=mul_mod(res,a,c);
        a=(a*a)%c;   //a=mul_mod(a,a,c);
        b/=2;
    }
    return res;
}

int main()
{
    LL a,b,c;
    scanf("%lld%lld%lld",&a,&b,&c);
    printf("%lld\n",mul_mod(a,b,c));
    printf("%lld\n",pow_mod(a,b,c));
    return 0;
}

相關文章