Project Euler 29

来源:互联网 发布:程序员修炼之道pdf高清 编辑:程序博客网 时间:2024/05/20 05:57

这道题我是用数学方法做的……手算的~


我承认是从答案推导了验证了手算答案的正确性……


显然这道题就是用剔除的方法。


显然2的出现有2^2,2^3,2^4,...,2^100

3的先跳过,看4的

4 = 2^2,出现了2^4,2^6,2^8,...,2^200,其中有多少是和2的重复呢?显然是100/2 - 2 +1

100/2是再算偶数个数,(-2+1)是因为从^2开始2,3,4,...,50,总共49个数。

3和9也是这个关系

10和100也是这个关系

2和8也是这个关系,32个重复


以此类推,可以算出

2:49+32+24+19+15

3:49+32+24

4:49+32

5:49

6:49

7:49

8:49

9:49

10:49

后面的平方都大于100,不必考虑了。


这些加起来是619,用99*99(总数)-619 = 9182.这个比正确答案少了一个!哪里多减了?


显然16在2^4和4^2处都进行了重复处理

32,64,81也是……

这肿么办……


那我们一点点容斥原理算吧……


先分析16:2^4处,-24,  4^2处,-49。2^4的24个全部重复……


想到8还有跟16重复的部分……


我实在不想写了……


4 --> 49

8 --> 49

9 --> 49

16 --> 58*****

25 --> 49

32 --> 48

36 --> 49

49 --> 49

64 --> 62*****

81 --> 58*****

100 --> 49

It seems that all squares have 49 occurences and all fourth powers have 9 occurences.

其实有所不同的就上面加星号的几个……手算真的能出来……

直接上python吧……

python实在太过强大……哎……python太强大……太……强大……强……大……


s = {1}for a in range(2, 101):tmp = anow = 0for b in range(2, 101):tmp *= aif tmp in s:passelse:now += 1s.add(tmp)print(a, now)print(len(s))

这个代码就是为了验证我的想法写的……重复的并不难找……但是问题就是……不好说明……还是直接代码吧……

原创粉丝点击