本篇文章將介紹關於快速冪的知識,將會對後面的學習有所幫助。
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...