1. 程式人生 > 其它 >快速冪 思想及程式碼

快速冪 思想及程式碼

技術標籤:學習筆記

根據二進位制來求,優化成 O ( l o g N ) O(logN) O(logN)

比如 2 10 2^{10} 21010的二進位制是1010,也就是說 2 10 = 2 101 0 2 = 2 2 3 ∗ 2 2 1 2^{10} = 2^{1010_2} = 2^{2^3} * 2^{2^1} 210=210102=223221

發現:將10的二進位制1010從後向前看,如果遇到1乘到答案

base是代表二進位制中k位的: a k a^k ak, 承接上一句,如果遇到1就把**$a^k$乘到答案**上

#include <iostream>
using namespace
std; int f(int a, int b, int mod) { int ans = 1; int base = a; while (b) { if (b & 1) // 看是否該乘到答案 ans = (ans * base) % mod; base = (base * base); // a的k次冪 b >>= 1; // 將b看完 } return ans % mod; } int main() { int a, b, mod; cin >>
a >> b >> mod; cout << f(a, b, mod); return 0; }