數論4 快速乘(1 0模板)

2021-09-26 10:13:20 字數 1155 閱讀 1332

一、 普通乘法:

對於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 快速乘也是一樣...