很多時候,對於乙個資料範圍很大的數,如n∈
\in∈(1, 2e9)分解質因數,若迴圈n次就會超時,所以通常做法是迴圈n
\sqrt
n次,再有因數的性質,算出大於n
\sqrt
n的情況,然而此方法有些部分需要引起注意,以下**為例
void
find_prime_factor
(int n)
}//!!有缺陷
}
則最後n有兩種可能,1或大於n
\sqrt
n的質數(注意n可能改變過)
因此,若題目要求僅「列印所有質因數「,要在!處要加上
if
(n >1)
prime[
++cnt]
= n;
以完善最答案
計算乙個數的尤拉函式,也有相應的知識點
int
phi(
int n)
if(n >
1)ans / n *
(n -1)
;}return ans;
其中2式好處有2:
1縮小n的值,使迴圈的次數減少;
2n的最終值可能是1或乙個大於n
\sqrt
n的單個的素因數p,2式排除用過的素因數,從而計算出,補足了缺陷
但有的題目,n
\sqrt
n的缺陷並不會很容易就能看出,也要注意在最後補上這個。如hankson 的趣味題
由《演算法競賽高階指南》p144的解法二,我們將a,b,c,d分別分解質因數,再由各質因數的次數來組成答案
#include
#include
#include
using
namespace std;
const
int max_n =
1e5+10;
int prime[max_n]
, cnt_prime =
0, v[max_n]
;void
find_prime()
}}intmain()
ans = ans * cntx;
}//試除法取根號的缺陷,若最後剩下乙個大於根號n的質數,則需特判if(
!(a ==
1&& b ==
1&& c ==
1&& d ==1)
)printf
("%d\n"
, ans);}
return0;
}
對於這一題,我們先用試除法(n
\sqrt
n)找出幾乎所有的質因數,中間隔了一大段操作,在最後輸入輸出的時候才有關於n的判斷,實際競賽中,可能很容易忘記。故要引起注意
算術基本定理(唯一分解定理 分解素因子)
include include include include include include include include includeusing namespace std int main printf d a 0 for int i 1 i cnt i printf n return 0...
算術基本定理(唯一分解定理)
每個大於1的正整數n都可以表示成素數之積的形式 n p1 a1 p2 a2 p3 a3.pi代表素數,ai代表指數 d n 是n的正因子的個數 d n a1 1 a2 1 a3 1 sum n 是n的所有因子之和 sum n 1 p1 p1 2 p1 a1 1 p2 p2 2 p2 a2 inclu...
1295 X的因子鏈 線性篩 算術基本定理
傳送門 前置知識 算術基本定理 任何乙個大於1的自然數 n,如果n不為質數,那麼n可以唯一分解成有限個質數的乘積n p1 a1 p2 a2 p3 a3.pn an,這裡p1 題解 由算術基本定理,我們可以將x拆成若干個質數相乘,那麼就可以將這些最小質因子進行排列組合相乘得到的遞增序列,滿足了題意要求...