|  | 
 
 发表于 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分钟。。。
 | 
 |