P1226 模板 快速冪 取餘運算

2021-10-10 09:26:20 字數 1005 閱讀 8280

題意:求b的p次冪對k取餘的結果

分析:先不考慮取餘的情況,我們來求b的p次

傳統思想上我們認為b的p次就是由p個b相乘得到的,所以就用一層for迴圈便可得到答案。如果用for迴圈你會驚奇的發現你tle了。這時候快速冪的好處就體現出來了。

首先應該知道的是任何數都能用二進位制表示出來。

對於乙個p我們可以用二進位制表示出來。假設p=6 他用二進位制表示出來是110. 按權值展開就是

p =0

∗20+

1∗21

+1∗2

2.

\ p = 0*2^+1*2^+1*2^\,.

p=0∗20

+1∗2

1+1∗

22.這時候

b p=

b0∗2

0+1∗

21+1

∗22=

b2∗b

4.

\ b^ =b^+1*2^+1*2^}=b^*b^\,.

bp=b0∗

20+1

∗21+

1∗22

=b2∗

b4.相信聰明的你已經看出了規律:b的p次可以用b的2的整數次冪的乘積表示,對於b的6次我們只要計算到b的4次就行了。然後根據p的二進位制形式,哪位上有1結果就成該位對應的權值即可.

對於取餘,首先得知道在過程中取餘不會對結果造成影響。所以只要乘的時候每次取一次就好了,不然會溢位。

下面附上**:

#include

using

namespace std;

#define ll long long int

ll b,p,k;

ll quick_mod

(ll a,ll b)

b>>=1;

//右移一位

a*=a;a%

=k;}

return ans%k;

}int

main()

P1226 模板 快速冪 取餘運算

原題 題目描述 輸入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 源 includeusing...

P1226 模板 快速冪 取餘運算

給你三個整數 b,p,k,求b的p次方mod k的值 輸入只有一行三個整數,分別代表 b,p,k 輸出一行乙個字串b p mod k s,其中 b,p,kb,p,k 分別為題目給定的值,ss 為運算結果。輸入 1複製 2 10 9輸出 1複製 2 10 mod 9 7對於乙個數的n次冪,我們可以將它...

洛谷P1226 快速冪取餘

模板模板快出來 模板如下 include include include using namespace std typedef long long ll typedef unsigned long long ull ll mod pow ull x,ull n,ull mod return res...