caioj1043因式分解(深搜+剪枝)

【题意】
分解一个整数n,格式如下:
n = a1*a2*a3*a4…….*am
比如:
12=12
12=6*2
12=4*3
12=3*4
12=3*2*2
12=2*6
12=2*3*2
12=2*2*3
总共8种

【输入格式】
一行一个整数n(1 < n < = 2^31 )。
【输出格式】
输出分解的总数。
【样例输入】
12
【样例输出】
8

题解:

#include<bits/stdc++.h>
using namespace std;
int num[10000];
int n;
int ans;
int t=0;
void getFactor()
{
    for(int i=2;i<=sqrt(n+1);i++){
        if(n%i==0){
            num[++t]=i;
            if(i*i!=n){
                num[++t]=n/i;
            }//必须预处理出他的因子,否则超时;
        }
    }
    num[++t]=n;
}
void dfs(int x)
{
    if(x==n)ans++;
    for(int i=1;i<=t;i++){
        if(x*num[i]>n)break;//这里不剪枝会有超时
        if(n%(x*num[i])==0){
            dfs(x*num[i]);
        }
    }
}
int main()
{
    cin>>n;
    getFactor();
    sort(num+1,num+t+1);
    dfs(1);
    cout<<ans;


}

猜你喜欢

转载自blog.csdn.net/lanshan1111/article/details/82944514