# 我們都知道有一門數學領域叫組合數學,其中整數的拆分問題是非常有名的,
# 例如 我們有1g、 2g、 3g、 4g、 5g的砝碼各一個,問能稱出多少的重量,各有多少稱法
# 這裏我們利用歐拉提出的母函數的概念(當然拉馬努金的公式也可以,拉馬努金是我非常喜歡的數學家), 直接帶入求解,(1+x)(1+x^2)(1+x^3)(1+x^4)(1+x^5)
def add_poly(L1,L2): #多項式加法,同次項係數相加
R=[]
if len(L1)>len(L2):#默認L2比較長
L1,L2=L2,L1
i=0
while i<len(L1):
R.append(L1[i]+L2[i])#從低次項開始對應相加
i+=1
R=R+L2[len(L1):len(L2)]#較長的多項式高次項直接複製
return R
def multiply_poly(L1,L2):#多項式乘法
if len(L1)>len(L2):
L1,L2=L2,L1
zero=[];R=[]
for i in L1:
T=zero[:]#存儲中間產生的結果多項式,每次更新結果多項式的列表長度
for j in L2:#一個單項式乘以多項式的每一項
T.append(i*j)
R=add_poly(R,T)
zero=zero+[0]# 每一個新的多形式都要比前一個多項式次數高1,列表長度增加,所以多補一個0
return R
sum_data = multiply_poly(multiply_poly(multiply_poly(multiply_poly([1, 1, 0, 0, 0, 0], [1, 0, 1, 0, 0, 0]),[1, 0, 0, 1, 0, 0]), [1, 0, 0, 0, 1, 0]), [1, 0, 0, 0, 0, 1])
print(sum(sum_data))