Codevs 2548 自然數積分解

2021-07-13 07:54:28 字數 1000 閱讀 5272

題目描述 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...