1. 程式人生 > >caioj1043因式分解(深搜+剪枝)

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;


}