标签:
6 的因子有 1, 2, 3 和 6, 它们的平方和是 1 + 4 + 9 + 36 = 50. 如果 f(N) 代表正整数 N 所有因子的平方和, 那么 f(6) = 50. 现在令 F 代表 f 的求和函数, 亦即 F(N) = f(1) + f(2) + .. + f(N), 显然 F 一开始的 6 个值是: 1, 6, 16, 37, 63 和 113. 那么对于任意给定的整数 N (1 <= N <= 10^8), 输出 F(N) 的值.
这题咱们要慢慢的看
首先,我试了一下10,发现一个规律:(对于总共的所有因子)
因子数字:1 2 3 4 5 6 7 8 9 10
因子个数:10 5 3 2 2 1 1 1 1 1
n/2以后都是1啊
然后前面的个数都是n/1取整
那么1~n/2就这么写一下:1**2*(n/1),第二个2**2*(n/1),以此类推
然后再观察一下,到根号n的时候,都是不一样的数字,根号n之后有一样的数字
那么,把根号n之前的加在一起做第一个和
然后发现,1到最后一个,也就是n,2到n/2个
由平方和公式
4~10的平方和等于1~10减去1~3
观察,根号n后面有一个4~10,一个4~5
也就是一个根号n到n/1(对应的数1),一个根号n到n/2(对应数2)
ps:这个2是根号n-1
那么写出程序计算分开计算,记得先算出1到根号n的平方和,别重复计算
N = 10 n0 = N**(1/2.0) if n0 > int(n0)+0.4: n0 = int(n0)+1 else: n0 = int(round(n0)) S = 0 s = n0*(n0+1)*(2*n0+1)/6 for i in range(1, n0+1 ): S += (i**2)*(N/i) for j in range(1, n0): n = N/j S += n*(n+1)*(2*n+1)/6 - s print S
测试的时候发现2,12等不对,然后发现当小数第一位大于4,比如根号2=1.414,这里就要进上去,根号2等于2
具体为啥我也不太清楚,规律吧。。。
标签:
原文地址:http://www.cnblogs.com/webgavin/p/5406132.html