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...