求助  整数因子分解问题
											问题描述:大于1的正整数n可以分解为n=x1 * x2 * ... * xn
例如n=12时
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
1<=n<=2000000000
对于这道题,我可以用递归做,不过参考书上说这题可以用动态规划做
在此请教一下大牛
程序代码:
/*
E-mail: sunkai [at] msn [dot] com
问题描述:
大于1的正整数n可以分解为n=x1 * x2 * ... * xn
例如n=12时
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
1<=n<=2000000000
*/
/*
分析:
DP之记忆化搜索
状态若用d[2000000000]则内存不足
因此采用结构体记录状态
经过简单数学推理,对于一个数N,它的因子数不超过N^(1/2)+1 
*/ 
#include<stdio.h>
#include<math.h>
struct DP
{
    int num;
    int sum;
} d[50000]={0};
int max=0;
void qsort(int low,int high,struct DP key[])
{
     int i=low,j=high;
     struct DP tag=key[i];
     if(i<j)
     {
            do
            {
              while(tag.num<key[j].num && i<j) j--;
              if(i<j)
              {
                key[i]=key[j];
                i++;
                while(tag.num>=key[i].num && i<j) i++;
                if(i<j)
                {
                  key[j]=key[i];
                  j--;
                }
              }
            }while(i<j);
            key[i]=tag;
            qsort(low,j-1,key);
            qsort(i+1,high,key);
     }
}
int dfs(int left)
{
    int i,p;
    int l,r,m;
    int count=0;
    l=0; r=max;
    while(l<=r)
    {
      m=(l+r)>>1;
      if(d[m].num<left) l=m+1; else r=m-1;
    }
    p=l; if(d[p].sum) return d[p].sum;
    for(i=1;i<=d[i].num;i++)
    {
      if(left%d[i].num==0) count+=dfs(left/d[i].num);
    }
    d[p].sum=count;
    return count;
}
int main(void)
{
    int i,j,tmp;
    int n;
    scanf("%d",&n); tmp=sqrt(n);
    for(i=1;i<=tmp;i++)
    {
      if(n%i==0)
      {
        d[max].num=i; max++;
        d[max].num=n/i; max++;
      }
    } max--;
    qsort(0,max,d);
    d[0].sum=1;
    printf("%d\n",dfs(n));
    return 0;
}