算術基本定理解析及其應用

2022-06-20 17:45:10 字數 4055 閱讀 5574

本文主要講述了算術基本定理的內容,具體的應用形式,重點結合例題展示如何使用算術基本定理求解問題。

算術基本定理

算術基本定理可表述為:任何乙個大於1的自然數 n,如果n不為質數,那麼n可以唯一分解成有限個質數的乘積n=p1a1p2a2p3a3......pnan,這裡p1

算術基本定理是初等數論中一條非常基本和重要的定理,它把對自然數的研究轉化為對其最基本的元素——素數的研究。唯一因子分解的思想從本質上講是指以下兩種性質: 「存在性和唯一性」。所謂「存在性」就是指乙個元素可以分解為有限多個不可約因子的乘積;「唯一性」是指這種分解表示在某種意義上來說是唯一的。

定理應用

演算法實現

1 typedef long

long

ll;2

const

int maxn = 1e6 + 7

;3 ll a[maxn], b[maxn];//

a[i]表示第i個質因子,b[i]表示第i個質因子的指數

4void fac(ll n, int& tot) 16}

17}18if(now != 1)

22 }

可以用如下**直接輸出2 到100的質因數分解結果

1 #include 2 #include 3 #include 4

using

namespace

std;

56 typedef long

long

ll;7

const

int maxn = 1e6 + 7

;8 ll a[maxn], b[maxn];//

a[i]表示第i個質因子,b[i]表示第i個質因子的指數

9void fac(ll n, int& tot) 21}

22}23if(now != 1) 27}

2829

intmain()

3038}39

return0;

40 }

view code

例題解析

lightoj 1341 aladdin and the flying carpet

題意給出乙個長方形的面積a(不是正方形),給出該長方形最小的邊b,問組成該面積的長方形有多少種組合方案。比如12 2,有、兩種組合方案。

解題思路

問有多少種組合方案,其實就是面積a有多少對因子的乘積等於a,然後去掉最小邊不滿足條件的對兒數。普通暴力尋找因子對兒數的方法,肯定是要超時的。這裡使用唯一分解定理的第乙個應用,計算出總的因子數,然後除以2,再減去不符合條件的因子對數即可。需要注意的是每次不必全部試除一遍,不然會超時,這就是這種方法的時間優化之處。

**

1 #include 2 #include 3 #include 4 typedef long

long

ll;5

const ll maxn = 1e6 +7;6

bool

isp[maxn];

7int

pis[maxn], tot;89

void getp(ll n)

16for(int j = 1; (j <= tot) && (i * pis[j] <= n); j++) 20}

21}22 ll fac(ll n)

34 ans *= (cnt + 1

);35}36

}37if(now != 1

)38 ans *= 1 + 1;39

return

ans;40}

41ll solve(ll s, ll b)

51return

ans;52}

53int

main()

5464

return0;

65 }

lightoj 1236 pairs forming lcm

題意給乙個n(1 ≤ n ≤ 1014),問滿足lcm(i, j) = n (1 =< i, j <= n 且 i <= j)的(i, j)有多少對

解題思路

一看n的大小就知道暴力肯定是不行了,我們試著用算術基本定理求解一下,將n = p1^x1 * p2^x2 * p3^x3...ps^xs(其中s是唯一分解式中所有質因子的個數)

先假設n = p1^x1;

要使 lcm(i, j) = n,只有兩種方法:

(1)i = p1^x1,則 j = p1^m(m屬於[0, x1]),  這樣(i, j)共有  (x1 + 1)種

(2)j = p1^x1,則 i = p1^n(n 屬於[0, x1]),   這樣(i, j)共有  (x1 + 1)種

那麼當 n = p1^x1 時答案就是2 * (x1 + 1)對(i, j),但是當m == n時這一對是計算重複的,所以需要 -1,則最終答案是2 * (x1 + 1) - 1 = 2 * x1 + 1;

推廣至n = p1^x1 * p2^x2 * p3^x3...ps^xs(其中s是唯一分解式中所有質因子的個數)可得總的方案數等於ans = (2 * x1 + 1) * (2 * x2 + 1) * (2 * x3 + 1) ...(2 * xs + 1);

題目中要求的是i <= j,所以需要將總的數目除以2,又由於當i 、j都等於n時只計算了一次,所以除以二之後需要再加上。故最終答案是 ans = ans/2 + 1;

**如下

1 #include 2 #include 3 #include 4 typedef long

long

ll;5

const ll maxn = 1e7 +7;6

bool

isp[maxn];

7int pis[maxn/10

], tot;89

void getp(ll n)

16for(int j = 1; (j <= tot) && (i * pis[j] <= n); j++) 20}

21}22 ll fac(ll n)

34 ans *= ( 2 * cnt + 1

);35}36

}37if(now != 1

)38 ans *= 2 * 1 + 1;39

40return

ans;41}

42ll solve(ll n)

46int

main()

4757

return0;

58 }

lightoj harmonic number

題意給出n(1 ≤ n ≤ 108)計算出調和級數的結果

解題思路

雖然沒有直接的公式,但是尤拉曾給出過乙個近似公式計算調和級數的和,但是由於前幾項誤差較大,所以我們先計算前10000的結果,之後的使用公式計算。

**

1 #include 2 #include 3 #include 4

5const

int maxn = 100010;6

using

namespace

std;

7const

double c = 0.57721566490153286060651209;8

double

a[maxn];910

intmain()

1116

intt;

17int

n;18 scanf("

%d", &t);

19for(int t = 1; t <= t; t++)

25else28}

29return0;

30 }

最後總結一下使用算術基本定理的心得,使用的時候注意分解,如何使用求得的正因子個數之和,以及所有正因子數之和,來計數。關鍵還是將問題轉換為數學模型。

算術基本定理

例題一 計算n!末尾0的個數 輸入 第一行上有個數字,表示接下來要輸入數字的個數。然後是m行,每行包含乙個確定的正整數n,1 n 1 000 000 000 輸出 對輸入行中每乙個資料n,輸出一行,其內容是n!中末尾0的個數 分析 對於任意乙個正整數,那麼其末尾0必然可以分解成2 5,每乙個0必然和...

算術基本定理

因為畢設要求,需要對這些初等數論的知識學習,做個筆記,以便日後複習。算術基本定理可表述為 任何乙個大於1的自然數 n,如果n不為質數,那麼n可以唯一分解成有限個質數的乘積n n的標準分解式。最早證明是由歐幾里得給出的,現代是由陳述證明。此定理可推廣至更一般的交換代數和代數數論。方法一 先用現代陳述方...

poset Dilworth定理及其應用

引用三篇比較好的文章,是對鏈,反鏈,偏序集,dilworth的講解和證明 ttang 神牛的筆記,axl牛,lambda2fei牛 推薦四個可以用此方法做出的習題 對於邊界問題,需要帶數試一試 hdu 1257 include include include include includeusing...