這題很明顯與 數的計數 有異曲同工之處。
但如果用它的方法來解這題卻是行不通的。
試分析一種情況,設m=20;
那么共有四種情況,分別為2*10,2*2*5,4*5,20;
但如果用上一種方法來做的話,卻有2*10,2*2*5,4*5,2*2*5,20共五種情況。
究其原因是因為左邊因式經過分解產生的組合可能會等於右邊因式經過分解產生的組合。
那么如果只對一邊的因式(例如右邊)進行分解呢?顯然,此時有可能會漏掉某些組合。
一直卡在這個死胡同里沒走出來,直到看到題解……
題解:按着題目的要求一步步來,然后運用遞歸思想。
分解時,按題目要求保證后一個因式大於等於前一個因式。(其中值本身除外)
為遞歸函數再增加一個形參,用來約束因式分解時最小因式的大小。
1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 int ans; 5 void dfs(int v,int a){ 6 for(int i=a;i<=v;i++){ 7 if(v/i>=i&&v%i==0){ 8 dfs(v/i,i); 9 } 10 if(i==v)ans++; 11 } 12 } 13 int main(){ 14 int n,m; 15 cin>>n; 16 while(n--){ 17 cin>>m; 18 dfs(m,2); 19 //答案至少為1 20 ans=ans>0?ans:1; 21 cout<<ans<<endl; 22 ans=0; 23 } 24 return 0; 25 }