尤拉計劃386題(反鏈的最大長度) 論壇python解法學習筆記
這是瑞士的Lucy_Hedgehog 在pe論壇386題第一個帖子中給出的,也是目前我見過的當中最快的。 原作者只給出了主要片斷,並說利用了非標準庫,我東拼西湊,終於讓它執行起來。沒有達到作者說的速度,也許我找的模組不夠高效。
# This is just a code snippet. # It needs non-standard python libraries. # 4/15/2013: Added a compact version of pi_table. # This is using Python 3.x def pi_table(n): '''Returns a table containing pi(m) for all integer m in V = {n//1, n//2, n//3, n//4, ... , 1}''' r = int(n**0.5) while r*r <= n: r += 1 V = [n//i for i in range(1, n//r+1)] + list(range(r-1,0,-1)) # C[i] == number or primes or products of primes > q up to i C = {i:i-1 for i in V} for q in range(2,r): if C[q] > C[q-1]: # q is prime pi = C[q-1] # number of primes smaller than q q2 = q*q for v in V: if v < q2: break C[v] -= C[v//q] - pi return C def factorization_count(n): '''Returns a table where the indices ares tuples of exponents and the values are the number of times these exponents occur in the prime factorization of the integers 1 .. n''' def rec(idx, exp, r): w = pi[r] - idx if w <= 0: return E = tuple(sorted(exp + (1,))) T[E] += w for i in range(idx, len(P)): p = P[i] if p*p > r: break rec(i+1, E, r // p) q = p*p k = 2 while q <= r: F = tuple(sorted(exp + (k,))) T[F] += 1 if q * p <= r: rec(i+1, F, r // q) k += 1 q *= p pi = pi_table(n) m = max(100, int(n**0.5)+5) P = all_primes(m) T = defaultdict(int) T[()] = 1 rec(0,(),n) return T def P386(n): x = Polynomial([0,1]) res = 0 T = factorization_count(n) for E in T: t = Polynomial([1]) for e in E: t *= Polynomial([1]*(e+1)) w = max(t.coef) #lt modifed from t.coeffs res += w * T[E] return res def all_primes(n): ##copy from Stack Overflow numbers = set(range(n, 1, -1)) primes = [] while numbers: p = numbers.pop() primes.append(p) numbers.difference_update(set(range(p*2, n+1, p))) return primes def timeo1(x): start = time.clock( ) print (P386(x)) stend = time.clock( ) thetime = stend-start return thetime --執行時間 >>> print(timeo1(1000000000)) 5844921982.0 9.915745406882706 (原帖說是6秒) >>> print(timeo1(100000000)) 528755790.0 2.2057292688625694
如果沒有安裝numpy,下載並安裝pip install "numpy-1.12.0b1-cp35-none-win32.whl"
需要的import語句有
import numpy as numpy from numpy.polynomial import Polynomial as Polynomial from collections import defaultdict import time
相關文章
- 尤拉計劃386題(反鏈的最大長度) 論壇c++解法學習筆記C++筆記
- 論壇發貼統計(筆記)筆記
- javaScript 學習計劃以及筆記JavaScript筆記
- 尤拉計劃695:隨機長方形隨機
- 尤拉計劃512題(冪的尤拉總計函式和)函式
- 用尤拉計劃題目來學q語法
- 學習態度和學習計劃
- orientDB學習筆記(一)六度分隔理論筆記
- 【遊戲設計筆記】遊戲設計師的一些自用學習網站/論壇/書籍筆記遊戲設計師學習網站
- 《SQL 反模式》 學習筆記SQL模式筆記
- 學習進度條__軟體工程概論第二週學習計劃軟體工程
- 學習進度條__軟體工程概論第一週學習計劃軟體工程
- 學習進度條__軟體工程概論第三週學習計劃軟體工程
- 學習進度條__軟體工程概論第六週學習計劃軟體工程
- 學習進度條__軟體工程概論第五週學習計劃軟體工程
- 學習進度條__軟體工程概論第七週學習計劃軟體工程
- 群論學習筆記筆記
- iOS學習筆記01 textfield 限定輸入的文字長度iOS筆記
- 360星計劃學習筆記-如何學好JavaScript筆記JavaScript
- 學習筆記----圖論學習中筆記圖論
- 學習進度條__軟體工程概論第四周學習計劃軟體工程
- 學習自己搭建論壇
- Linux 學習筆記--任務計劃 crontabLinux筆記
- 尤拉計劃595題:增量隨機排序隨機排序
- 尤拉計劃425題:質數連線
- input最大長度限制問題
- 資訊理論理論學習筆記筆記
- 【區塊鏈學習】《區塊鏈學習指南》學習筆記區塊鏈筆記
- 尤拉計劃463題:奇怪的遞迴關係遞迴
- jive論壇反編譯編譯
- 【統計學習方法|筆記】第1章 統計學習方法理論筆記
- 動態規劃學習筆記動態規劃筆記
- go學習筆記劃重點Go筆記
- 尤拉計劃605題:結對投幣遊戲遊戲
- Python-學習計劃Python
- python學習筆記Python筆記
- 【學習筆記】python筆記Python
- 數論學習筆記 (1):整除筆記