快速冪和快速乘

2021-10-08 22:24:29 字數 905 閱讀 7691

2^10 = 2^5 * 2^5;

2^5 = 2 * 2^4;

2^4 = 2^2 * 2^2;

2^2 = 2^1 * 2^1;

2^1 = 2 * 2^0;

有些時候偶數的情況就只需要乘它本身就夠了,時間複雜度少了很多,這樣的話2^10只需要5步就可以求出來了,但是迴圈的話,卻需要十次。

在二進位制中假如是2^10那麼10對應的二進位制就是1010,那麼1號位,3號位都是1,所以就有了10 = 23+21=8+2,所以210=28+2^2。

所以二進位制就先初始化ans = 1,用來存放累積的結果,然後判斷b的二進位制嗎末尾是否為一來判斷是奇數還是偶數,如果是奇數就乘以a,然後讓a平方,並且b右移一位。只要b等於0,就返回ans。

時間複雜度為:log(n)

ll poww

(ll a, ll b, ll mod)

a = a * a % mod;

b >>=1;

}return ans;

}}

a^b

可以把 a * b這樣算:

a * b = a + a + a + …+ a

而a * 1 = a

a * 2 = 2a

a * 4 = 4a

a * 8 = 8a

…所以可以推出:

a * (2 ^ k) = 2 ^ k * a

優點:不會爆範圍

ll ksc

(ll a, ll b, ll mod)

a =(a + a)

% mod;

b >>=1;

}return ans;

}

64位整數乘法

快速乘和快速冪

由於計算機底層的關係,計算機在計算加的時候往往要比計算乘要快,所以我們可以用加法來實現乘法。乘法其實就是讓乘數個被乘數相加 也許可以這麼說吧 由於計算機是二進位制的,所以我們使用二進位制運算加法。快速乘的原理是乘法分配律。例如計算20 14,首先把14化成二進位制數,1110 然後就是20 0 2 ...

快速冪和快速乘

2.板子 計算a k p 把k拆成二進位制表示形式,比如k等於5的時候,k 101 2 c1 1 c2 0 c3 1 預處理a c1,a c2,a ct 這樣計算a k p時,答案即為res a c1 a c3 a 2 0 2 0 a a 2 1 2 1 a a 2 2 2 2 a a 2 3 2 ...

快速冪 快速乘

直接求解,需要迴圈b次。思路 將b轉化為二進位制。對應為1的次數的冪保留,只需要將保留的冪的結果進行乘積就是a b。class solution def fast self,a,b b bin b 2 res 1for i in b 1 if i 1 res res a a a return res...