約數詳細分析

2021-07-12 03:57:14 字數 2390 閱讀 6751

約數詳細分析

我們先來認識一下約數:

約數分正約數和負約數兩種,我們一般只討論正約數。也就是說,接下來所提的約數,只考慮正約數。

如果有乙個數k,滿足k|n,那麼k就是n 的約數(因數),n是k的倍數。

求乙個數的約數是資訊學競賽裡乙個基礎的不能再基礎的問題。

如果只求乙個數,最容易想到的就是列舉。當然列舉也有技巧:n=a×b,因為我們只要知道a,就可以求出b,所以只用列舉a,而不需要把b也列舉。保證a<=b,那麼a<=√n,所以只用列舉1-√n所有數,就能得出n所有的約數了。

如果要求1-n內所有的數的約數的個數呢?

和上面是一樣,把每個數都列舉一遍就行了,能接受n=200000。

有沒有什麼更快的方法呢?

看看初一希望盃必備的乙個知識點:

n=p1q1

×p2q2 

×p3q3

×…×piqi

根據乘法原理,可以得出n的約數一共有

(q1+1)

×(q2+1)

×(q3+1)

×…(qi+1)個

從上面可以得出:分解質因數及其對應的指數也是乙個可行的方法。

具體就是先用篩法求出√n內所有的質數,之後去乙個個分解,相乘。

這種方法n=1000000已經是極限了(c++)。其實乙個個求的話,這是很優的了。

**:

#include#include#define fo(i,x,y) for(int i=x;i<=y;i++)

using namespace std;

const int max=1000000,po=sqrt(max*1.0);

bool bz[po+1];

int f[max+1],p[169];

int main()

f[i]*=a+1;

}//分解質因數

if (k>1) f[i]*=2;//統計大於√i的質因數

}}

想從根本上提速,關鍵在於統一求解,換個說法就是利用已知的,去求未知的。

我們觀察公式,可以想到:先求出質因數只有p1的所有數的約數的個數,再求出質因數只有p1,p2的所有數的約數的個數,以此類推。  可是複雜度似乎太高了一些,因為每次都要把之前求出的數全部列舉log(pi,max)遍。然而,明顯很多的數都會超出範圍,所以我們給乙個快排,超過max時就能提前退出了。每個數隻會被求一遍,所以這一部分的複雜度是線性的,可是快排的時間不能接受,所以我們放棄這個思路。

我們也可以直接深搜指數,時間複雜度是線性的,每個數同樣只會被求一遍。但是需要注意許多細節的地方,該退的要退,否則,可能會被一些不必要的計算拖死。**複雜度有些高,且常數大。

目前最快的方法是線性篩法,線性篩法不僅可以篩質數、尤拉函式,連約數的個數、約數和也是可以篩,前提是找到該類數的性質。

_t6j6p

3q02wobu4xi1

z906wmrwutmswvxwqobihqrodvlgdeiibt-pj3r6kgkow

答案當然是可以的。我們可以利用篩性篩法的基本思想,去實現我們的目標。

e[i]表示i的最小的質因子的指數。d[i]表示i的約數的個數。p[j]表示在篩去i的倍數時,列舉到的第j個質數。

在用i去篩掉i的倍數時,如果i和當前的p[j]互質,

那麼d[i*p[j]]=d[i]*2,e[i*p[j]]=1;

因為p[j]在i*p[j]中對應的指數是1,所以約數的個數要乘以2。

因為p[1..j-1]和i都互質,所以p[j]也是i*p[j]的最小質因子,e[i*p[j]]也就順理成章等於1。

否則,就說明:p[j]是i的最小質因子,那麼我們之前統計的d[i]便有了用武之地。既然p[j]是i的最小質因子,且我們又知道p[j]做為i的質因子所對應的指數e[i],很容易推出d[i*p[j]]=d[i]/(e[i]+1)×(e[i]+2),e[i*p[j]]=e[i]+1。

為什麼呢?因為p[j]在i中所對應的指數是e[i],所以p[j]對d[i]的貢獻值是(e[i]+1),那麼現在我們乘乙個p[j],那麼指數加1,對d[i*p[j]]貢獻值就是了(e[i]+2),先除以之前的貢獻值,再乘上新的,就得到了新的答案。

根據基礎線性篩法的特性,此時我們又可以直接退出j的迴圈了。所以時間非常愉快地是線性的。可以跑過30000000。

若有不懂的人,他們應該拍手慶祝,因為接下來有**:

#include#define fo(i,x,y) for (int i=x;i<=y;i++)

using namespace std;

const int mn=30000000;

bool bz[mn+1];

int p[mn+1],e[mn+1],d[mn+1];

int main()

fo(j,1,p[0])

if (i%p[j]==0)

{if (mn/p[j]

const詳細分析

最近在分析 linux 驅動的過程過程中遇到一些關於 const 的使用,現在在這裡詳細剖析一下 一,const int p 首先分析一下幾個概念 1 p 是乙個指標變數,因而它也是乙個變數,所謂變數就有變數的位址和變數的值,而這裡 p變數的值就是乙個位址,該位址下存放的是乙個整數,p的值等於這個整...

vue cli 詳細分析

vue lic 是 vue 官方提供的腳手架工具,預設搭建好乙個專案的基本架子,我們只需要在此基礎上進行相應的修改即可。注意 安裝 vue cli 前需要事先配置好 node 環境 npm install g vue cli 如果是 mac 電 sudo表示以管理員的許可權 sudo install...

LiveData詳細分析

目錄介紹 感知生命週期 自動解除資料訂閱 2.1 具有很明顯的優點 不會發生記憶體洩露 不會再產生由於activity處於stop狀態而引起的崩潰 不需要再解決生命週期帶來的問題 實時資料重新整理 解決configuration change問題 資料共享 2.2 細節點補充4.1 單獨使用live...