簡單快速冪

2022-09-28 03:57:13 字數 1837 閱讀 3414

本篇文章將介紹關於快速冪的知識,將會對後面的學習有所幫助。

p1226傳送門

如何讓計算機計算出 \(a^b \bmod p\)

第一種演算法:樸實無華的 \(o(n)\) 演算法

long long qpow(int a,int b,int p)

return ans;

}

當然,以上解法肯定正確,但當 \(b \geq 10^8\) 後,計算機就撐不住了。

重要公式

在取餘的基本性質中

\(a^ \bmod m = (a^p \bmod m) \times (a^q \bmod m) \bmod m\)

因此:\(a^ \bmod m = (a^n \bmod m)\bmod m\)

\(a^\bmod m =((a^n \bmod m)^2 \bmod m)\times a \bmod m\)

如果我們重複利用上述公式,可以提高計算效率。

例如,我們要計算 \(7^ \bmod 100\)。

\(7^ \bmod 100=(7^8)^2 \times 7 \bmod 100\)

\(7^ \bmod 100=(7^4)^2 \bmod 100\)

\(7^ \bmod 100=(7^2)^2 \bmod 100\)

\(7^ \bmod 100=(7^1)^2 \bmod 100\)

\(\large\color\)

\(\large\color\)

\(7^1 \bmod 100 = 7\)

\(7^2 \bmod 100 = (7^1)^2 \bmod 100 = 49\)

\(7^4 \bmod 100 = (7^2)^2 \bmod 100 = (49)^2 \bmod 100 = 1\)

\(7^8 \bmod 100 = (7^4)^2 \bmod 100 = 1^2 \bmod 100 =1\)

\(7^ \bmod 100 = (7^8)^2 \bmod 100 \times 7 \bmod 100= 1^2 \bmod 100 +7\bmod 100 = 7\)

因此,我們只需要 \(o(\log n)\) 的時間複雜度。

示例**:

int qpow(int a,int b,int m)

b[t]=1;

for(int i=t-1;i>=0;i--)

return e[0];//返回值答案為 b[0]

}

以上演算法是正確的,只不過過於冗長,我們可以使用 c++ 的特性來使**更加簡潔。

根據我們上面推得公式,採用遞迴演算法,會讓程式更加簡潔。

示例**:

int qpow(int a,int b,int m)

return t;

}

迴圈寫法:

我們把 \(b\) 轉為二進位制,隨後從末尾至首位,遇到 \(1\) 就乘現在的位,隨後再取模。

int qpow(int a,int b,int m)

return ans;

}

最後,我在附一下本題的**,如果沒有ac,可以通過作者的**除錯。

#includeusing namespace std;

typedef long long ll;

ll a,b,p;

ll q_pow(ll a,ll b)

return ans;

}int main(){

cin>>a>>b>>p;

cout《至此,我們已經將快速冪的介紹完畢了,如果你喜歡該文章,那就點個贊吧!

簡單快速冪

對於求乙個數a的n次冪,我們第一想法就是呼叫包含在標頭檔案cmath或math.h標頭檔案下的pow a,n 函式,為了演算法看起來簡單用int代替大數模版。最簡單的實現就是用乙個迴圈和乙個變數,不斷用變數乘上底數,當然,這樣做的效率並不高o n include using namespace st...

簡單的快速冪

題目大意 輸入b,p,k的值,求b p mod k的值。其中b,p,k k為長整型數。輸入輸出格式 輸入格式 三個整數b,p,k.輸出格式 輸出 b p mod k s s為運算結果 例如 輸入樣例 1 2 10 9 輸出樣例 1 2 10 mod 9 7 輸入樣例 2 4523 59 7762 輸...

快速冪的簡單解釋

快速冪演算法,顧名思義就是求冪時速度很快 廢話 看了很多部落格裡的解釋,都說得很玄奧 其實快速冪很容易解釋的。比如求3的20次冪,一般我們會用迴圈乘法來求,也就是需要迴圈20次。但是再想想,3 20 9 10,這樣只需要迴圈10次了。繼續,9 10 81 5。這裡似乎進行不下去了,其實還可以繼續,8...