快速冪求模

2021-10-02 05:28:07 字數 1394 閱讀 6595

快速冪

簡要介紹:能

快速算底數的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 ...