程序代码:/*
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
#include
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
{
do
{
while(tag.num
if(i
{
key[i]=key[j];
i++;
while(tag.num>=key[i].num && i
if(i
{
key[j]=key[i];
j--;
}
}
}while(i
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
}
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;
}
[[it] 本帖最后由 卧龙孔明 于 2008-3-21 20:26 编辑 [/it]]