题目描述
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
dfs
我们暴力枚举可以分解成的数的第一个数枚举出来,这就跟自然数划分成和一样,要保证不重复,那么前面的数一定要比后面的数小,如果比后面的数小的话,那么这种划分方案一定已经存在过了,然后我们判断,现在我们分解成的数的另外的一个因数,如果当前数可以整除我们枚举出来的因数,那么也就说明我们可以将数分为当前因数及当前数除以当前因数,那么划分方案数就可以加一
是不是感觉很乱,我们来看个样例,即当n=8时,我们先枚举到2,然后判断8%2==0 那么4即为另一个因子,方案数+1,然后第二次2,判断4%2==0,则另一个因子为2,2*2*2=8,方案数++
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int n,sum,num[500000],ans; int read() { int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9') ch=getchar(); while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();} return x*f; } void dfs(int k,int s) { for(int i=2;i*i<=s;i++) { if(k<=i&&s%i==0) ans++,dfs(i,s/i); } } int main() { n=read(); dfs(1,n); printf("%d",ans+1); return 0; }