快速冪 取餘運算(模板)

2022-03-16 15:43:00 字數 1555 閱讀 1415

有那麼一種演算法可以讓計算a^b變得更快,那就是快速冪。如果直接暴力計算的話需要計算b次。時間蠻長的。

輸入a,b.(a,b為整數)計算a^b。

輸入格式:

兩個整數a、b。.

輸出格式:

輸出「a^b=s」

s為運算結果

前提:你需要了解二進位制,十進位制。位運算的知識(當然也可以沒有,萬事皆可模擬。)

沒有位運算的:

#include#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

char e[10001

];int

cd;long

long quickpow(long

long a,char

b)

return

ans;

}void zh(long

long

a) sum--;

int js=sum;

cd=sum;//轉換為二進位制後的最後乙個元素的位置。如(10)10=(1010)2最後乙個元素的位置為三。

for(int i=0;i<=sum;++i)

}int

main()

**:

//

省略......

long

long quickpow(long long a,long longb)

return

ans;

}

ps:不用位運算的**當指數為零時需要特判!

注意:因為是乘方運算所以很有可能會爆long long!

input:

2 11

output:

先講一下(&、>>)位運算.

&:『&』叫做按位與。作用:把參與運算的兩個數對應的二進位制相與,只有對應的二進位制均為1時,結果(應該也是二進位制的形式)的對應位才為1,否則為0。

>>:'>>'叫做右移。作用:把「>>」左邊的運算數的各二進位制位全部右移若干位(「>>」右邊的那個數)。

以此樣例講一下吧。

(11)10=(1011)2。

如何將二進位制轉換為十進位制那?

醬紫,1*20 +1*21 (+0*22) +1*23。

∴211=2(1*20 +1*21 (+0*22) +1*23)。

小學我們學過 an*am=an+m。

∴211=21*22*28。

快速冪就是這樣計算的!

模擬一下樣例:

ans=1,base=2。

11的二進位制數為1011,不為0 進行迴圈直到為0。

1011的最後一位為1,ans*base。

若不為1,就不進行ans*base。

base*base,就是由2變成了4(2^2)。

1011抹去最後一位直到為0.

就是醬紫。

模板 快速冪 取餘運算

輸入b,p,k的值,求b p mod k的值。其中b,p,k k為長整型數。輸入輸出格式 輸入格式 三個整數b,p,k.輸出格式 輸出 b p mod k s s為運算結果 輸入輸出樣例 輸入樣例 1 2 10 9 輸出樣例 1 2 10 mod 9 7 硬來當然不是好方法。但是有乙個規律不知道各位...

快速冪 取餘運算

給你三個整數 b,p,k,求 b p mod k。輸入只有一行三個整數,分別代表 b,p,k。輸出一行乙個字串b p mod k s,其中b,p,k分別為題目給定的值,s為運算結果。對於100 的資料,保證0 leq b,p leq 2 1 leq k leq 2 快速冪的模板題,沒有什麼好說的。有...

取餘運算(mod,快速冪)

題目描述 輸入b,p,k的值,求bpmodk的值。其中b,p,k k為長整型數。輸入 輸入b,p,k的值。輸出 求bpmodk的值。輸入樣例 2 10 9 輸出樣例 2 10 mod 9 7 題目分析 對於任何乙個自然數b都有b 2 b 2 b 2 例如 19 2x9 1 所以,b19 b9 9 1...