1. 程式人生 > >模板 2018-01-17 快速冪 快速乘

模板 2018-01-17 快速冪 快速乘

快速冪太常用了, 單開一篇.

舉例!

2^100  %100

4^50  %100

16^25  %100

16^24 *16  %100

256^12 *16  %100

(256%100)^12 *16  %100

56^12 *16  %100

3136^6 *16  %100

(3136%100)^6 *16  %100

36^6 *16  %100

1296^3 *16  %100

(1296%100)^3 *16  %100

96^3 *16  %100

96^2 *16*96  %100

9216^1 *1536  %100

(9216%100)^1 *(1536%100)  %100

16^1 *36  %100

576%100

76

大概是這麼個樣子.(矇混過關的原因是剛剛舉例全部打錯了, 不打啦!)

應用的原理是, 如果我想計算兩個數的積之後取模的結果, 可以分別把兩個數取模再相乘

同理我想計算一百萬個數的積(就是冪嘛), 我可以把這一百萬個數都取個餘然後再乘.

關於如何降次,上面有舉例的.

模板如下:

long long int quick_pow(long long int a,long long int p,long long int mod)
{//計算(a^p)%mod
    long long int res=1;
    a=a%mod;
    while(p)
    {
        if(p&1)
            res=res*a%mod;
        p>>=1;
        a=(a*a)%mod;
    }
    return res;
}

還有一個東西,叫做快速乘

原理很像的.

模板如下

long long int quick_multi(long long int a,long long int p,long long int mod)
{//計算(a*p)%mod
    long long int res=0;
    a=a%mod;
    p=p%mod;
    while(p)
    {
        if(p&1)
            res=(res+a)%mod;
        p>>=1;
        a=(a+a)%mod;
    }
    return res;
}
好有愧疚感啊, 這麼點東西都能水一篇.