da={1:0}
def solve(n):
res=0
#print ‘----‘
for i in range(2,n+1):
#print "n:%d,i:%d" % (n,i)
if (n%i==0):
#print "i:",i
if da.has_key(n/i):
res+=da[n/i]
#print "i:%d,da[n/i]:%d,res:%d" % (i,da[n/i],res)
else:
da[n/i]=solve(n/i)
res+=da[n/i]
#print da
da[n]=res+1
return da[n]
a=int(raw_input("input:"))
re=solve(a)
print re
print da
源递归:
void solve(long n)
{
if(n==1)
total++;
else
{
for(long i=2;i<=n;i++)
if(n%i==0)
solve(n/i);
}
优化后代码,利用f(n)=Ef(m)+1这个公式 备忘录来算
E表示求和 m为n的所有约数,例如n=12,m为6,4,3,2
原文:http://my.oschina.net/tigereatspinach/blog/371685