【noi 2.2_1751】分解因数(递归)
题意:问一个给定正整数的分解因数的方式数。N=a1*a2*...*ak(a1<=a2<=...<=ak)。
解法:一步步分解该数,总方式数为一个个因数被分解的方案数之和。
可用大括号表示,也可想象成一棵树[分层构造],每个节点为不同的因数分解方式。(结构图凑合着看吧.....)
N=
X={u*v, u={...}
* w*r, w={...}
Y ...a种方案数
}
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<cmath> 5 6 int mmax(int x,int y) {return x>y?x:y;} 7 8 int f(int x,int y) 9 { 10 int s=1;//self 11 for (int i=mmax(2,y);i*i<=x;i++)//保证从小到大 12 if (x%i==0) s+=f(x/i,i); 13 return s; 14 } 15 16 int main() 17 { 18 int T; 19 scanf("%d",&T); 20 while (T--) 21 { 22 int x; 23 scanf("%d",&x); 24 printf("%d\n",f(x,0)); 25 } 26 }