重走普及路 分治 經典演算法 快速冪

2021-07-09 04:41:29 字數 896 閱讀 1210

輸入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
分治,即

將大問題拆分為小問題,分而治之,各個擊破,然後在合併回來。

first:暴力解決不解釋 o(n) 爆

t:=b;

for i:=2 to p do t:=(t*b) mod k;

second:

因為a^b mod c=(a^2)^(b/2) mod c  (b mod 2=0);  

a^b mod c=((a^2)^(b div 2)*a) mod c (b mod 2=1)  

所以可以在計算過程中不斷地將底數平方、指數除以2,用另乙個變數記錄最終答案。

var t,b,p,k:int64;

begin

readln(b,p,k);

write(b,'^',p,' mod ',k,'=');

b:=b mod k;

t:=1;

while p>0 do begin

if p mod 2=1 then t:=t*b mod k;

p:=p div 2;

b:=(b*b) mod k;

end;

writeln(t);

end.

普及練習場 分治演算法 P1010 冪次方

題目描述 任何乙個正整數都可以用 2 的冪次方表示。例如 137 27 23 2 0 同時約定方次用括號來表示,即 a b 可表示為 a b 由此可知,137 可表示為 2 7 2 3 2 0 進一步 7 22 2 20 2 1用2表示 並且 3 2 2 0 所以最後 137 可表示為 2 2 2 ...

重走長征路 《演算法競賽入門經典》第2章 習題筆記

這一章開始看書了,在寫題之前加了知識點回憶的部分。學到回憶的內容包括 for 簡單直接 while 適合每次的變化量不同 不是 遞增 式迴圈 方便每次初始化變數 迴圈的次數不確定 do.while 迴圈終止判斷在計算之後 算術運算溢位 程式效率低下 輸出中間結果 計時函式 time.h clock ...

分治演算法之2011 高精度除以低精度,快速冪

高精度除以低精度,快速冪 分治演算法,將n個2011相乘並對10000取餘看作n 2個4121相乘並對10000取餘 4121為2011 2011對10000取餘結果 同理。直到最低位為0,位數為1,得到結果。include include using namespace std char a 21...