快速冪
簡要介紹:能
快速算底數的n次冪。其時間複雜度為 o(log₂n), 與樸素的o(n)相比效率有了極大的提高。
其原理:
假設求a的b次方 先
把b轉換成
二進位制數
。該二進位制數第i位的權為
2^(i-1) 例如
11的二進位制是1011
因此,我們將a¹¹轉化為算
其應用:
1.一般演算法
int ans = 1;
for(int i = 1;i<=b;i++)
ans = ans % c;
缺點:如果a和b過大,很容易就會超限。
改進(a*b) mod c = ((a mod c)*(b mod c)) mod c
那麼根據上面的定理可以推導出另乙個定理:
(a^b) mod c = (a mod c)^b mod c
利用分配率,即:
(a*b) mod c = ((a mod c)*(b mod c)) mod c
對base或者ans進行運算的時候,都必須使用一次分配率,所以都要mod c。
**:
int pow_mod(long long int a,long long int b,long long int c)
return ans;
}
例題
17級學姐中有個學姐,人稱撞桿子的cc,因為cc學姐走路的時候總是在低頭玩手機,所以經常撞桿子,在一次把鼻子撞破後,cc學姐在想自己出一次門究竟要撞多少個桿子。一天cc學姐打算去廣場玩,已知cc學姐走完全程共撞n次桿子,cc學姐第一次撞桿子時是走了1公尺的時候,每次撞完桿子後潛意識都會改變自己的小心程度,即第i次撞桿子後經過2i % 107公尺後會撞下乙個桿子,現在cc學姐想知道自己走了多遠。
輸入乙個n(1 <= n <= 10^5),cc學姐走完全程要撞的桿子數量
輸出乙個s,cc學姐走完全程所走的距離
1
34
1
715
多組測試資料,請在輸入時迴圈輸入到檔案尾,共700組資料,請控制程式執行時間
#include#includeint pow_mod(long long int a,long long int b,long long int c)
return ans;
}int main()
}printf("%d\n",s);
}return 0;
}
4.心得:
通過快速冪的學習,了解到通過不同知識點的學習,更高效的解決問題,再接再厲。
快速冪求模
所謂的快速冪,實際上是快速冪取模的縮寫,簡單的說,就是快速的求乙個冪式的模 餘 在程式設計過程中,經常要去求一些大數對於某個數的餘數,為了得到更快 計算範圍更大的演算法,產生了快速冪取模演算法。一.先從簡單的例子入手 先求值,在取模。演算法1.首先直接地來設計這個演算法 int ans 1 for ...
快速冪求模
演算法1.首先直接地來設計這個演算法 很容易因為數字過大而溢位。int ans 1 for int i 1 i b i ans ans a ans ans c 演算法2.根據公式a b mod c a mod c b mod c 改進為 int ans 1 a a c for int i 1 i b...
快速冪和快速冪求模演算法
求 x 的 n 次方 當然,這道題你也可以採用 n 次迴圈讓 n 個 x 相乘,不過,這樣的做法毫無意義,因為估計小學生也會做。不過這道題如果知道了思路,還是挺簡單,我舉個例子吧,例如我們要求 2 8。1 首先,我們可以通過 2 2 4 得到 2 2 2 接著,我們利用剛才的結果,讓 4 4 16 ...