快速冪,是屬於分治的一類習題,其思想如同分治,就是分而治之,所以看到題目的大資料,就要思考如何將大問題拆分成若干個相同解法的小問題,所以推導公式:
#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 會超時,這裡引入快速冪來...