1200:分解因数
这题很明显与 数的计数 有异曲同工之处。
但如果用它的方法来解这题却是行不通的。
试分析一种情况,设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 }