[アルゴリズム/テンプレート]高速電力
まず、定義
急速可能な電源(O(logN個)\)\時間複雑度計算\(A ^ Bの\)アルゴリズム。
クイックパワーは、一般的に使用されるアルゴリズムです。
第二に、実現原理
実際には、\(^ bは\)は乗法タイプBである、我々はO(N)時間内に処理単純なアルゴリズムを使用することができます。小さなデータに直面し、我々はまた、使用することができます(POW(A、B)\ \)が計算されます。データ範囲が大きすぎるか、当社の既知のデータタイプを超えてデータを算出する際に一度、今回は、高速処理能力を使用する必要があります。
乗算方法、STテーブルのRMQの問題だけでなく、「2」の関連で、疑いを見つけるためのLCA手法を倍増のように。高速処理能力があるような方法です二进制拆分法
。我々は、意志塩基価\(A \)バイナリに分解\(logN個\)処理の一部。ここでは、説明するために特定の例を使用します。
例えば、我々が計算する\(3 ^ {14} \)値:
\((14)_ {10} =(1110)2} = {_ 2 ^ 3 ^ 2 + 2 ^ 2 + 1 \) 。私たちは、正の整数が任意にそのように分割することができます見つけることができます\(\ 2 K ^)でも、フォームを追加します。そして、唯一の2進数の1が蓄積される時間のために。限り、我々は3を乗じたベース番号に続けて、インデックスの最下位レベルが1
記憶されている場合res
、各治療右の後の内部変数。これは、迅速な実装原理の力です。
第三に、テンプレート
以下では、高速のテンプレート(非再帰的)の力です。
int quick_pow(int a,int b){
int res=1;//记得赋值为1!
while(b){
if(b&1) res=res*a;//最低位为1
b>>=1;a=a*a;
}
return res;
}
第四に、例
P1226 [テンプレート]は迅速電力動作引き継ぐ||
コードを次のとおりです。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll b,p,k;
inline ll quick_pow(ll b,ll p,ll k){
ll res=1;
while(p){
if(p&1) res=(res*b)%k;
p>>=1;
b=(b*b)%k;
}
return res%k;
}
int main()
{
scanf("%lld%lld%lld",&b,&p,&k);
printf("%lld^%lld mod %lld=%lld",b,p,k,quick_pow(b,p,k));
return 0;
}