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
时间: 2024-10-12 09:05:40