如果我們要求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 因此,我們可以借助這個法則,只需要在迴圈乘積的每一步都提前進行 取模 運算,而不是等到最後直接對結果 取模 也能達到同...