快速冪演算法

2021-10-04 13:48:37 字數 1457 閱讀 3655

冪運算是一種常見的運算,最容易想到的累乘法的複雜度為o(n),但很多時候這並不夠快,所以出現了快速冪運算。

(為什麼不用內建函式pow?)有時候冪運算結果特別大,超出了long long的範圍,這時候答案會要求你取模,這時候用pow函式是肯定不行的。

**:

//求x的n次方

long

long

power

(long

long x,

long

long n)

n = n >>1;

//右移一位,即縮小一倍

x *=x;//擴大一倍

}return res;

}int

main()

通過快速冪處理的一道題目:

題目描述 description

有n頭奶牛住在n個環形的牛圈,奶牛編號為0到n-1,牛圈編號也為0到n-1,i號牛住在第i號牛圈。

現在牛們想實施住宅滾動制度。每滾動一次,第0號圈的奶牛會順時針搬到第m號牛圈中,第1號圈的奶牛會順時針搬到第1+m號牛圈中,…,第n-m號圈的奶牛會順時針搬到0號牛圈,

也就是說原來的第i號牛圈的奶牛會順時針搬到i+m號牛圈。

試判斷,進行了10^k輪滾動後,原來在x號圈的奶牛現在在幾號牛圈。

輸入描述 input description

一行,四個正整數,n m k x

輸出描述 output description

10^k輪後,最初在第x個圈的奶牛所處牛圈的編號

樣例輸入 sample input

10 3 4 5

樣例輸出 sample output

5資料範圍及提示 data size & hint

對於 30%的資料,0 < k < 7;

對於 80%的資料,0 < k < 10^7;

對於 100%的資料,1 < n < 1,000,000,0 < m < n,1 <= x <=n,0 < k < 10^9。

解析:本題通過普通的冪運算會超出long long 的表示範圍,故只能通過快速冪來解決。

題解:

#include

using

namespace std;

long

long n, x, m;

long

long

power

(long

long a,

long

long k)

k = k >>1;

//右移一位,即縮小一倍

a *= a;

//擴大一倍

}return res;

}int

main()

演算法提高快速冪(快速冪演算法詳解)

問題描述 給定a,b,p,求 a b mod p。輸入格式 輸入共一行。第一行有三個數,n,m,p。輸出格式 輸出共一行,表示所求。樣例輸入 2 5 3 樣例輸出 資料規模和約定 共10組資料 對100 的資料,a,b為long long範圍內的非負整數,p為int內的非負整數。所謂的快速冪,實際上...

快速冪演算法

在 上一直沒有找到有關於快速冪演算法的乙個詳細的描述和解釋,這裡,我給出快速冪演算法的完整解釋,用的是c 語言,不同語言的讀者只好換個位啦,畢竟讀 c的人較多 所謂的快速冪,實際上是快速冪取模的縮寫,簡單的說,就是快速的求乙個冪式的模 餘 在程式設計過程中,經常要去求一些大數對於某個數的餘數,為了得...

快速冪演算法

模運算 公式 a b mod n a mod n b mod n mod n a b mod n a mod n b mod n mod n a b mod n a mod n b mod n mod n 要保證n是整數 要知道a mod n和b mod n都是比n小的 利用這些共識可以有效地防止溢...