當兩個相乘數x y較小時,我們可以直接x * y % p。
但當兩個數都為long long型別呢?很明顯直接相乘會爆範圍 。
其實乘法可以轉換成加法,我們可以邊加變取餘;但不是直接 y 個 x 乙個乙個相加,因為這樣絕對會超時。
我們可以將 y 進行進製轉換
**實現:
ll q_mod
(ll x, ll y, ll p)
// ll 代表 long long
x = x <<
1% p;
// 相當於x = x * 2 % p;
y >>=1;
}return ans;
}
看 著 是 不 是 有 快 速 冪 內 味 了利用 long double 捨棄低位且範圍保留18位的特點,加上c++ 的自動轉換功能完成快速乘的運算**實現:
ll q_mod
(ll x, ll y, ll p)
// ll 代表 long long, ld 代表long double
快速乘總結
因為我們知道乘法有的時候會溢位,即使是 long long 也可能在乘法時因為結果過大溢位 當模數也是 long long 所以我們需要尋找一種能高效完成乘法操作並且不會爆 long long 的演算法,也就是快速乘。本文也將對幾種常用快速乘及其優化技巧做個總結。我們知道乘法其實就是把很多個加法運算...
快速乘總結
因為我們知道乘法有的時候會溢位,即使是 long long 也可能在乘法時因為結果過大溢位 當模數也是 long long 所以我們需要尋找一種能高效完成乘法操作並且不會爆 long long 的演算法,也就是快速乘。本文也將對幾種常用快速乘及其優化技巧做個總結。我們知道乘法其實就是把很多個加法運算...
快速乘與快速冪總結
快速乘 a b p while b 把b看成二進位制 a a 2 p 2 式 要採用遞推 取模的方法得到 b b 1 右移一位 printf lld ans 推導過程 a 2 k1 a 2 k2 a 2 k3 a 2 kn p a 2 k1 a 2 k2 a 2 k3 a 2 kn 1 p a 2 ...