|
发表于 2020-6-26 21:41:43
|
显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2020-7-15 22:29 编辑
- from math import gcd
- def parallel(a,b): #串联
- #a=a[0]/a[1];b=b[0]/b[1];return a+b
- a0 = a[1]*b[0]+a[0]*b[1]
- a1 = a[1]*b[1]
- g = gcd(a0, a1)
- return (a0//g, a1//g)
- def series(a,b): #并联
- #a/c, b/d => c/a+d/b => cb+ad/ab = ab/(cb+ad)
- #1/(a[1]/a[0] + b[1]/b[0]) = 1/(a[1]*b[0]+a[0]*b[1] /a[0]*b[0]) = a[0]*b[0] / a[1]*b[0]+a[0]*b[1]
- a0 = a[0]*b[0]
- a1 = a[1]*b[0]+a[0]*b[1]
- g = gcd(a0, a1)
- return (a0//g, a1//g)
- print(parallel((60,1),(60,1))) #120
- print(series((60,1),(60,1))) #30
- maxn = 18
- Cn = [set([]) for i in range(19)]
- Cn[1] = {(60,1)}
- for n in range(2, maxn+1):
- r = set()
- for i in range(1, (n//2) +1):
- for a in Cn[i]:
- for b in Cn[n-i]:
- r.add(parallel(a,b))
- r.add(series(a,b))
- Cn[n] = r
- r = set()
- for c in Cn:
- r = r.union(c)
- print(18, len(r)) #3857447
- #算法没有优化,花费了大概1分钟。。。
复制代码 |
|