1. 程式人生 > >快速乘法取模

快速乘法取模

如果讓你計算66666666666666666*555555555555555555(17位),這樣一個結果對33333333333333333取模你會怎麼計算呢,像這樣2個long long型的整數相乘肯定會爆掉,所以我們引入一個快速乘法來計算,這個演算法的原理是怎樣的呢,其實和快速冪差不多。

例如:5(a)*8(b) = 5*2*2*2,5*9 = 5*3*3 = 5*(2+1)*(2+1),就是利用了這樣的計算原理,就把一個數不斷除以2,一個數不斷乘以2,如果b%2 == 1的話就在加一個a,因為類似於5*3啊,5+5*2對吧。。。

實現程式碼:

LL work(LL a, LL b, LL mod)
{
    LL ans = 0;
    while(b) {
        if(b&1) {
            ans += a;
            ans %= mod;
        }
        a *= 2;
        a %= mod;
        b /= 2;
    }
    return ans;
}