求助 整数因子分解问题
问题描述:大于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; }