算術分解定理取根號的注意點

2021-10-21 21:35:48 字數 1418 閱讀 8882

很多時候,對於乙個資料範圍很大的數,如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拆成若干個質數相乘,那麼就可以將這些最小質因子進行排列組合相乘得到的遞增序列,滿足了題意要求...