時間限制: 1 s
空間限制: 32000 kb
題目等級 : ** gold
題解把自然數n分解為若干個自然數之積,輸出方案數。
輸入描述 input description
自然數n,(1≤n≤2000000000)
輸出描述 output description
方案數樣例輸入 sample input
樣例輸出 sample output
資料範圍及提示 data size & hint
20 可分為
20 4 5
2 10
2 2 5
分類標籤 tags 點此展開
深度優先搜尋
搜尋這個題資料很大(tle了2個),所以必須優化,
先看沒優化的程式:
#include#includeusing
namespace
std;
intsum;
void dfs(int k,int
n) }
}int
main()
優化思路
乙個數n,可以分為 1×n 2 x ….(n減小), 3× .. i× … 其中 i最大取到 √n,這樣 數n 被分解為兩個數的乘積 而左半部分的所有可能通過列舉各種可能值得到,而右半部分繼續遞迴處理即可。這裡在分解的時候會遇到 重複分析的情況,如16 可分為 2 4 4 ,與 4 4 2 ,因為分解時,是按照乘號左側的數由小到大來分,因此左側應該不大於右側即可。所以函式的引數中傳入前一次分解的數字,每次分解前先判斷,是否右側不小於左側。最後的結果上要加上 1xn ,因為自身也算是一種結果。
ac**:
#include#includeusing
namespace
std;
int sum=1
;void dfs(int k,int
n) }
}int
main()
2548 自然數積分解
題目描述 description 把自然數 分解為若干個自然數之積,輸出方案數。輸入描述 input description 自然數n,1 n 2000000000 輸出描述 output description 方案數樣例輸入 sample input 20 樣例輸出 sample output ...
Codevs 2548 自然數積分解
題目描述 description 把自然數 分解為若干個自然數之積,輸出方案數。輸入描述 input description 自然數n,1 n 2000000000 輸出描述 output description 方案數樣例輸入 sample input 20樣例輸出 sample output 4...
自然數積分解
題目描述 把自然數 分解為若干個自然數之積,輸出方案數。輸入描述 自然數n 1 n 2000000000 輸出描述 方案數。樣例輸入 20 樣例輸出 4 資料範圍及提示 20 可分為 204 52 10 2 2 5 優化前 源 include int n,ans 0 void solve int t...