篩選質數
二、約數
未完待續
質數即因子只有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博弈。...