|
发表于 2016-10-21 11:50:11
|
显示全部楼层
因为10**12的数字量太大了,暴力破解肯定行不通。这样就要从其他方面着手。
然后我发现了很有趣的解法“找规律”:
首先根据题设,写函数,找出前几个符合条件的解:
- import math
- def func(t):
- tb = (1+math.sqrt(2*t*t-2*t+1))
- if tb % 2 == 0:
- return int(float(tb)/2)
- else:
- return False
- print "(blue,red,total)"
- t = 3
- b = func(t)
- while t < 100000:
- while b == False:
- t+=1
- b = func(t)
- print (b,t-b,t)
- t+=1
- b = func(t)
复制代码
得到结果:
- (blue,red,total)
- (3, 1, 4)
- (15, 6, 21)
- (85, 35, 120)
- (493, 204, 697)
- (2871, 1189, 4060)
- (16731, 6930, 23661)
- (97513, 40391, 137904)
- [Finished in 0.2s]
复制代码
通过观察前几项,可以发现:
1. 红盘子red符合递归:red(n)=6*red(n-1)-red(n-2) 【red(0)=0,red(1)=1】
2. 总盘子total符合递归:total(n)=6*total(n-1)-total(n-2)-2 【total(0)=1,total(1)=4】
有了这2个递推关系,就可以写递推关系式了。
- def digui(t):
- red = [0,1]
- total = [1,4]
- while total[-1] < t:
- red.append(6*red[-1]-red[-2])
- total.append(6*total[-1]-total[-2]-2)
- print "blue: " + str(total[-1]-red[-1])
- digui(10**12)
复制代码
结果:
- blue: 756872327473
- [Finished in 0.1s]
复制代码
轻松搞定 |
|