一、 普通乘法:
對於a*n:
普通乘法 本質: n個a相加;
/*******普通乘法*****/
int ans;
for(
int i =
1;i <= n;i++
)
普通乘法迴圈n次, 所以時間複雜度為o(n), 如果n特別大, 普通乘法的效率就非常低。
二、快速乘:
1、我們一步一步的引入快速乘的原理。
首先,加入你要算 a*4; 用普通乘法要迴圈4次每次+a。
然而, 你有沒有發現 在迴圈第二次時 t2 = a+a;
我只需要再迴圈1次,將 ans = t2+t2;就能算出答案。 (如圖)
這樣,就節省了一次迴圈。
是怎樣節省了一次迴圈呢,上面我們演示的, 我們在算到 a4 時,然後利用了 a*2的結果
直接算出了a4。
快速乘就是基於這個原理, 利用之前計算的結果,提高了效率。
2、快速乘講解:
快速乘和快速冪都用到了二進位制思想。
對於a*n
假設n == 6吧:
6的二進位制為(110)
那麼 n就可以表示為(1*22 + 1 * 21 + 0 * 20)
通過二進位制轉換的原理,現在該書被表示成了 就是指數函式a * 2b * (0或1)的形式(x 為0 , 1, 2…)。
所以我們可以模擬指數函式來計算 a×n的結果。
當 二進位制對應位為1時我們 就加上指數函式的這一項。
為0就不加。
因為指數函式的 後一項 == 前一項的兩倍( cn = cn-1 +cn-1, n屬於 1 , 2 , 3 , 4 )的特點, 所以我們就可以利用指數函式的上一項計算下一項, 提高了計算效率。
ll quickmul
(int a,
int n,
int mod)
//快速乘
return ans;
}
3、時間複雜度的證明
和快速冪相同——》
ACM a b p 數論 快速冪 快速乘
a b time limit 1000ms memory limit 65535kb 64bit io format description 求a的b次方,取模mod 1 a,b,mod 1e18 input 多組輸入,每組資料一行,3個正整數,分別為a,b,mod output 每組資料輸出一行,...
快速冪 快速乘模板
給定正整數a b p,求a的b次方modp的值 輸入描述 第一行乙個正整數t表示測試資料組數。接下來t行,每行三個正整數a b p,含義如上文。輸出描述 輸出t行,每行乙個非負整數表示答案。輸入2 2 5 10 57284938291657 827493857294857 3847295837482...
快速冪與快速乘模板
快速冪與快速乘,都運用到了乙個定理 每乙個正整數都能唯一表示為2的次冪的和。即 不同的數的二進位制表達形式唯一。因此a b 可以轉化為幾個a2i相乘。又由於a2i a2 i 1 2,所以可以遞推求出每個a2 i。int pow int a,int b,int p return ans 快速乘也是一樣...