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