快速冪運算

2021-07-30 13:46:16 字數 1088 閱讀 6479

如果我們要求x^n次方;

當n很大的時候;

會gg;

這個時候就會用到快速冪演算法了, 顧名思義, 快速冪, 快速求冪。

因為任何乙個數都可以用2進製表示。

比如9 = 2 ^3 + 2^0;

7 = 2^2 + 2^ 1 + 2 ^0;

所以我們可以把n看成 n = 2 ^ k1 + 2 ^ k2 + 2^k3...... 這樣來表示。

當然我們同樣可以把x用這樣表示。

即 x = x ^(2^k1) * x ^ (2 ^ k2)*  ......

若n = 22;

x ^ 22 = x^ 16 * x ^ 4 * x ^ 2;

22轉化成二進位制是10110。

直接看**

模板 :

#includeusing namespace std;

#define clr(x) memset(x, 0, sizoef(x))

typedef long long ll;

const int mod = 100000007;

ll mod_pow(ll x, ll n, ll mod)

return res;

}int main()

#includeusing namespace std;

#define clr(x) memset(x, 0, sizeof(x))

typedef long long ll;

const int maxn = 65005;

int prim[maxn];

void init()

}}ll mod_pow(ll x, ll n, ll mod)

return res;

}int main()

}if(flag)

printf("the number %lld is a carmichael number.\n", n);

else

printf("%lld is normal.\n", n);

}return 0;

}

快速冪運算

知識點 快速冪運算 快速冪運算 原來 當我們計算a k時候,一定是 a a a a a k個 現在 把k拆成二進位制,為了表達清楚,我們這裡讓k 11 11 dec 1011 b 1 2 3 0 2 2 1 2 1 1 2 0 我們會發現其中有0的地方是個廢操作 那麼我們將去除這個廢操作的過程叫做快...

快速冪運算

首先,快速冪的目的就是做到快速求冪,假設我們要求a b,按照樸素演算法就是把a連乘b次,這樣一來時間複雜度是o b 也即是o n 級別,快速冪能做到o logn 快了好多好多。它的原理如下 假設我們要求a b,那麼其實b是可以拆成二進位制的,該二進位制數第i位的權為2 i 1 例如當b 11時 a1...

快速冪運算

求 x n mod 當資料過大時,會造成溢位,因此無法得出正確的答案。已知取模運算的運算法則 a b p a p b p p 也就是如果我們要求 abc d a db dc d d 因此,我們可以借助這個法則,只需要在迴圈乘積的每一步都提前進行 取模 運算,而不是等到最後直接對結果 取模 也能達到同...