反素數

反素數

對於任何正整數x,其約數的個數記作g(x)。例如g(1)=1、g(6)=4。 如果某個正整數x滿足:g(x)>g(i) 0

性質

性質一:一個反素數的質因子必然是從2開始連續的質數.

性質二:p=2^t1*3^t2*5^t3*7^t4.....必然t1>=t2>=t3>=....

算法實現

•40分思路 :

•最佳化前

考慮直接暴力枚舉xx以及xx的因數,時間複雜度約為O(n^2O(n2log_2log2n)n)。

•最佳化後

還是考慮直接暴力枚舉xx,但是我們可以通過最佳化枚舉因數的時間複雜度來降低整個程式的時間複雜度,這種方法的時間複雜度約為O(nO(nlog_2log2nn\times×sqrt(t))sqrt(t))。

100100分(滿分)思路:

什麼是反素數?

反素數就是區間內約數個數最多的那個數。根據題目要求,如果有多個滿足,選取最大的一個。

上文的引用部分摘自@stupid_one的部落格園,有刪改。

很顯然題目要求的區間就是[1,n][1,n]。那么我們怎么求反素數呢?

如果我們設p{}p為指數,k{}k為指數的話,那么如果一個數xx可以被分成如下形式。

x=\prod_{i=1}^{n}{p_i^{k_i}}x=∏i=1npiki。

那么xx的因數個數就是\prod_{i=1}^{n}{k_i+1}∏i=1nki+1。

如果設p_ipi嚴格遞增,並且k_i=0ki=0也算在內,則如果k_x<k_ykx<ky並且x<yx<y,那么顯然這個數不可能是反素數,因為交換k_xkx和k_yky會更好。 所以當p_ipi遞增時k_iki是遞減的,這個數xx才可能是反素數。

所以我們可以據此搜尋。

素數表可以篩一波,也可以這樣:

因為前12個素數的積>2 \times 10^9>2×109,所以最多用到12個素數,手動打素數表即可。

思路和代碼分別來自@羅愷的部落格以及@Goes的部落格。

最佳化前的40 分代碼(用時7000ms):

最佳化後的40分代碼(用時6104ms ):

100分代碼:

相關詞條

相關搜尋

熱門詞條

聯絡我們