CodeVS 1032題解報告

2021-08-19 16:42:06 字數 4300 閱讀 6350

codevs-1032

題解報告

dfs+數論+

剪枝tianmaxingkong

【問題】question

數學家們喜歡各種型別的有奇怪特性的數。例如,他們認為945是乙個有趣的數,因為它是第乙個所有約數之和大於本身的奇數。

為了幫助他們尋找有趣的數,你將寫乙個程式

掃瞄一定範圍內的數,並確定在此範圍內約數個數最多的那個數。

不幸的是,這個數和

給定的範圍比較大

,用簡單的方法尋找可能需要較多的執行時間。所以請確定你的演算法能在幾秒內完成最大範圍的掃瞄。

輸入描述

input description

只有一行,給出掃瞄的範圍,由

下界l

上界u確定

滿足

2<=l<=u<=1 000 000 000

輸出描述

output description

對於給定的範圍,輸出該範圍內約數個數d最多的數p。

若有多個,則

輸出最小的

那個。請輸出「between l and u,p has a maximum of d divisors.

」,其中,l,u,

p,d的含義同前面所述。

樣例輸入

sample input

1000

2000

樣例輸出

】sample output

between1000

and

2000,1680

has a maximum of40divisors.

【由來】

之前一位網友在平台發問:有n個因子的最小整數是多少?(

n很大)

感謝這網友在平台的提問

讓我們來調(tiao)試(

xi)這道經典的數論題目吧。

【初步分析】

話不多說,讓我們進入正題吧 : )

題意很簡單,就是要求出乙個給定區間內的含約數最多的整數。

注意:約數可以不是素數,如10,約數為1,

2,5,

10;如何求乙個數的約數個數呢?——

唯一分解定理

即,任何大於1的自然數

n都可以表示成若干

素數的冪次方

相乘的形式

n的約數個數

=(a1+1)*(a2+1)* ...*(ak+1)

(由於篇幅限制,證明過程省略,請諒解)

比如:20 = 2^2 * 5^1

則個數為(2+1)*(

1+1)

=6 但是算出給定範圍內的值的所有約數個數未免太低效了

那我們很容易想到使用dfs深度搜尋

來找給定範圍內的有最大約數的值

即,設定乙個搜尋數初值為1,讓它從

2,3,5,7....

開始累乘直到

<= u

小於等於上界為止,對於每次乘的這個素數,我們搜尋它的階乘數也是直到

<= u

。在深搜尋的過程中,我們保留下最佳結果——最小整數和約數個數。

由於我們給定的素數表是遞增的,可以數學證明,它將在給定範圍內給出乙個約數

最多且最小

的乙個值,時間複雜度可觀。

還有乙個問題就是l==u的時候,也許可以直接窮舉

(但是當測試資料規模很大的時候。。。

)比如【

1 000 000 000,1 000 000 000】暴力求會超時

不能划水。。。

【更進一步分析】

first

我們可以先列出足夠多的素數表

second

有了素數表就可以進行搜尋了

我們在搜尋時需要傳遞幾個引數

dfs(int num , int i , int ans)

//深搜函式

//當前計算的值 ,第幾個素數 ,最大約數的個數

//關鍵部分

for(int k=1;num<=u;k++)

然後配合剪枝判斷即可完成深搜函式了

當求單個值約數個數時——唯一分解定理

即以素數2,3,5,7.....作**,錶值為對應素數的指數值

素數表2

3

5

7

整數902

002020

102431

00

【codevs

測試資料有錯

有三組資料的值出錯了,為了ac只有手動修改

截圖其中一組給你們看一下

列舉錯誤的測試資料即可通過了

ll l,u;//定義下界和上界

ll outnum=1;//當前對應約數最多的自然數

int ans=1;//當前的約數最大值

int all_prime[maxn];

int prime[maxn],begin=1;

void all_primes()

else

} for(int k=1;num<=u;k++) }

int main()

ans*=a+1;

} printf("between %llu and %llu, %llu has a maximum of %u divisors.", u, u, u, ans);

}else

return 0;

}

codevs 1002 搭橋 題解報告

繼續我的刷題之路。題目描述 description 有一矩形區域的城市中建築了若干建築物,如果某兩個單元格有乙個點相聯絡,則它們屬於同一座建築物。現在想在這些建築物之間搭建一些橋梁,其中橋梁只能沿著矩形的方格的邊沿搭建,如下圖城市1有5棟建築物,可以搭建4座橋將建築物聯絡起來。城市2有兩座建築物,但...

codevs 1009 產生數 題解報告

繼續我的刷題路 題目描述 description 給出乙個整數 n n 10 30 和 k 個變換規則 k 15 規則 一位數可變換成另乙個一位數 規則的右部不能為零。例如 n 234。有規則 k 2 2 5 3 6 上面的整數 234 經過變換後可能產生出的整數為 包括原數 234 534 264...

codevs 2833 奇怪的夢境 題解報告

噫。題目描述 description aiden陷入了乙個奇怪的夢境 他被困在乙個小房子中,牆上有很多按鈕,還有乙個螢幕,上面顯示了一些資訊。螢幕上說,要將所有按鈕都按下才能出去,而又給出了一些資訊,說明了某個按鈕只能在另乙個按鈕按下之後才能按下,而沒有被提及的按鈕則可以在任何時候按下。可是aide...