[アルゴリズム/テンプレート]の素因数分解
の素因数分解の最初に、基本的な定理
\(\でN \(FORALL \ inftyの)\ 1) ユニークな素数の有限数の積に分解することができる、のように書くことができる:
\ [^ {N P_1 = ^ {P_2のC_1とC_2}} ... {^ P_M C_m } \]
ここで、\(C_I \)は正の整数であり、\(P_I \)を満たす素数である\(P_1 \ P_2 LT \ ... LT \ P_M LT \)を。
私たちは〜2スキャンすることができます\(\ sqrtのN \) Nで割り切れるkが、その後、私たちはしばらく蓄積取り除かK、Nからすべての係数kを削除する場合は、数kのそれぞれの数を。
合成数Nに結合して走査前の因子の特定の数は、それがから除去されるため、したがって特定の数割り切れるNが素数でスキャンします。
[2、Nが最終でない場合、なお\(\ SQRT N \) 、割り切れる]次にNが素数であり、それは直接統合されています。
要約すると、時間の複雑さの素因数分解である\(O(\ sqrtのN)\) 。
第二に、テンプレート - 素因数分解
コードは以下の通りであります:
inline void Divide(){
cnt=0;
for(int i=2;i<=sqrt(n);i++){
if(n%i==0){
p[++cnt]=i;
while(n%i==0){
num[cnt]++;
n/=i;
}
}
if(n>1){
p[++cnt]=n;num[cnt]=1;
}
}
}//其中p为底数,num为对应的指数