首页 > 代码库 > 高手是怎么样练成的19

高手是怎么样练成的19

 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

高手是怎么样练成的19