演算法基礎入門 數論(數學知識基礎)

2021-10-13 14:21:15 字數 4085 閱讀 3517

篩選質數

二、約數

未完待續

質數即因子只有1和他本身的數。

常用的有分解質因數,下邊根據題目來解釋一下如何分解質因數。

輸出質因子在左邊,該質因子出現的次數在右邊,每個正整數的質因子輸出完畢之後,輸出乙個空行

分解質因數

分解質因數時間複雜度為:o(sqrt(n))題目

acwing**原題通道

給定n個正整數ai,將每個數分解質因數,並按照質因數從小到大的順序輸出每個質因數的底數和指數。

輸入樣例:

2

68

輸出樣例:

2 1

3 12 3

**

若要對於x分解質因數,我們從小到大列舉x的質因子,列舉到sqrt(x),對於每乙個質因子算出他的個數即可。

在**實現中,我們是列舉了從[1,

sqrt

(x)]

[1,sqrt(x)]

[1,sqr

t(x)

]之間的所有的數,這樣做是沒有問題的!

因為當我們列舉到了i

ii的時候,此時 [2,

i−1]

[2,i-1]

[2,i−1

]之間的所有的因子全部被除乾淨了,那麼如果此時 x%i

==

0x\%i==0

x%i==0

的話,說明 x

xx 是 i

ii的倍數,並且 x

xx 中不包含任何 [2,

i−1]

[2,i-1]

[2,i−1

] 之間的數,那麼此時 i

ii 一定是 x

xx 的質數。

而且對於數 x

xx 來說,只存在乙個大於 sqr

t(x)

sqrt(x)

sqrt(x

) 的質因子,可以使用反證法,假如存在兩個大於 sqr

t(x)

sqrt(x)

sqrt(x

) 的質因子,假設為m,那麼 m∗m

m*mm∗

m 一定大於 x

xx , 所以只存在乙個,所以我們只需要列舉 [1,

sqrt

(x)]

[1,sqrt(x)]

[1,sqr

t(x)

]

#include

using namespace std;

void

divide

(int x)

printf

("%d %d\n"

, i , s);}

// 在這裡,如果x不為1的話,x就是最後乙個質因數

if(x >1)

printf

("%d %d\n"

, x ,1)

;printf

("\n");

}int

main()

return0;

}

篩選質數

埃氏篩法

埃氏篩法可以幫助我們迅速篩選掉質數,原理:用乙個bool陣列來表示當前數是否是質數,從2開始遍歷,如果遍歷到質數,就把當前質數的倍數(不包含自己)全部標記為不是質數,這樣,所有的合數就一定會被篩掉。

題目給定乙個正整數n,請你求出1~n中質數的個數。

資料範圍

1≤n≤106

輸入樣例:

8輸出樣例:

4

**
#include

using namespace std;

const

int n =

1000010

;int n , cnt;

// cnt記錄質數的個數

int primes[n]

;bool st[n]

;void

get_primes

(int x)

}int

main()

線性篩法

線性篩法在10^7以上會比埃氏篩法快一倍的時間。

核心:每乙個合數都至少有乙個最小質因子,使用最小質因子將合數篩掉。

證明:

每乙個合數都會被篩掉

#include

using namespace std;

const

int n =

1000010

;int n , cnt;

// cnt記錄質數的個數

int primes[n]

;bool st[n]

;void

get_primes

(int x)}}

intmain()

乙個數可以寫成:

p1

a1 × p2

a2 × … × pn-1

an-1

× pn

an

約數的三個公式:

(1)試除法求乙個數的所有約數

(2)約數個數:(a1

+1)×

(a2+

1)×.

..×(

an+1

)(a1 + 1) × (a2 + 1) × ... × (an + 1)

(a1+1)

×(a2

+1)×

...×

(an+

1)(3)約數之和:(p1

0+p1

1+…+p1

a1) × … × (pn

0+pn

1+…+pnan)

證 明:

(約數個

數)

證明:(約數個數)

證明:(約數

個數)

對於x來說,假設b為x的其中乙個約數

那麼b就可以用x的某幾個約數或者所有的約數來表示,只不過次冪不同:

b = b1^k1 * b2^k2 * ... *bn^kn

(b1,b2...bn為 p1,p2...pn中挑出來的幾個數,0<=ki<=ai)

那麼對於x的所有約數,我們都可以用p1^(0~a1) * p2^(0~a2) * ... * pn^(0~an)

來表示x的任何乙個約數

所以約數的個數為:(a1 + 1) × (a2 + 1) × ... × (an + 1)

約數個數

試除法求約數個數(時間複雜度:o(sqrt(n)) )

題目描述

給定n個正整數ai,對於每個整數ai,請你按照從小到大的順序輸出它的所有約數。

輸入格式

第一行包含整數n。

接下來n行,每行包含乙個整數ai。

輸出格式

輸出共n行,其中第 i 行輸出第 i 個整數ai的所有約數。

資料範圍

1≤n≤100,

2≤ai≤2∗109

輸入樣例:

2

68

輸出樣例:

1 2 3 6 

1 2 4 8

#include

#include

#include

using namespace std;

int t , n;

void

get_divisors

(int n)

}sort

(res.

begin()

, res.

end())

;for

(int x : res) cout << x <<

' ';

cout << endl;

}int

main()

return0;

}

未完待續

數學知識及演算法

1.簡單形式 如果n 1個物體被放進n個盒子,那麼至少有乙個盒子包含兩個或更多的物體。例1 在13個人中存在兩個人,他們的生日在同一月份裡。例2 設有n對已婚夫婦。為保證有一對夫婦被選出,至少要從這2n個人中選出多少人?n 1 2.加強形式 令q1,q2,qn為正整數。如果將 q1 q2 qn n ...

基礎數學知識(一) 拉格朗日乘子法

這幾天一直在看支援向量機,然後就是大量大量的數學公式,一直迷迷糊糊的,然後一直遇到拉格朗日,拉格朗日,原來數學基礎也不好,沒怎麼學過,於是下定決心要把拉格朗日乘子法搞懂,花了幾天,看了一些文章,算是對拉格朗日乘子法有了簡單的了解,下面就和大家簡單的分享分享啦!我們在求解優化問題的時候,可能小夥伴們遇...

演算法基礎課 第四章 數學知識(四)

i 1 j 1 判斷二進位制第j位是否存在 t p j s if t 1 890.能被整除的數 給定n堆物品,第i堆物品有ai個。兩名玩家輪流行動,每次可以任選一堆,取走任意多個物品,可把一堆取光,但不能不取。取走最後一件物品者獲勝。兩人都採取最優策略,問先手是否必勝。我們把這種遊戲稱為nim博弈。...