溫習(一) 快速冪

2021-08-03 09:21:46 字數 1346 閱讀 2594

快速冪,是屬於分治的一類習題,其思想如同分治,就是分而治之,所以看到題目的大資料,就要思考如何將大問題拆分成若干個相同解法的小問題,所以推導公式:

#include

#include

#include

#include

long long b,p,k;

long long work(int n)

int main()

當然這並不是最快的快速冪,你還可以採用更高效的方法,如二進位制:

在二進位制中,有乙個神奇的運算叫做按位與,它的意思是如果在對其的情況下,兩位都是1,取出來的結果就是1,否則就是0。在這個的基礎上,我們在推導n&1的情況(n為任意整數):

若n為11,則(n)10=(11)10=(1011)2 00001011

所以,11&1———————————–00000001

00000001

這個方法可以用來判斷這個數的奇偶(這不是重點),但真正神奇的是下面這乙個式子:

(a^11)%k=(a^8)%k*(a^2)%k*(a^1)%k

這也是分治的思想,運用二進位制,使時間複雜度縮短為log2(a)。

#include

#include

#include

#include

long long b,p,k;

int main()

tmp=(tmp*tmp)%k;

p>>=1;

}printf("%lld\n",ans%k);

return

0;}

這裡有一道快速冪的題目:轉圈遊戲,這道題目是一道noip提高組的題目,總體來說就是要推導公式,這一題給大家思考,提供標程:

#include

#include

#include

#include

int work(int b,int n,int k)

int main()

//公式:(x+m

*10^k)%n

這裡是改進版的(二進位制實現):

#include

#include

#include

#include

int bb,pp;

int main()

bb=(bb*bb)%n;

pp>>=1;

}ans=(ans*m)%n;

ans+=x;ans%=n;

printf("%d\n",ans);

return0;}

//(x+m

*10^k)%n

快速冪 普通快速冪 矩陣快速冪

題意 n個人排隊,f表示女,m表示男,包含子串 fmf 和 fff 的序列為o佇列,否則為e佇列,有多少個序列為e佇列。分析 矩陣快速冪入門題。下面引用巨巨解釋 用f n 表示n個人滿足條件的結果,那麼如果最後乙個人是m的話,那麼前n 1個滿足條件即可,就是f n 1 如果最後乙個是f那麼這個還無法...

快速冪(整數快速冪 矩陣快速冪)

1 整數快速冪 例如求x 8 就是x x x x x x x x 正常的運算方式是,x的值乙個個往上乘上去,乘法運算執行7次 x x x x x x x x 也可以採用這種運算方式,先進行乘法得到x 2再對x 2進行三次乘法。這種運算要明顯比第一種情況要快 所以對於整數快速冪,也是結合了這種思想 x...

快速冪(矩陣快速冪)

求 3 0 3 1 3 n mod 1000000007 input 輸入乙個數n 0 n 10 9 output 輸出 計算結果 sample input 3sample output 40 分析 利用等比數列的求和公式得所求和是 3 n 1 1 2,如果暴力求3 n 1 會超時,這裡引入快速冪來...