題目:
data遊戲裏面,召喚師可以控制冰雷火三種元素,並通過元素組合產生新的技能,現在我們修改了一張新的地圖,地圖中他能夠控制n種元素,並且將m個元素圍成一個圈組成一個新的技能(這m個元素通過旋轉或反轉,算作重複,如123、231、312、321、213、132都算重複),那麼召喚師能組合多少技能(20000>=n>=1,1<=m<=10000),由於結果可能很大,請將結果對1000000007取餘。例:
輸入:
3 3
輸出:
10
解析:111、112、113、122、123、133、222、223、233、333一共10種。
解答:
根據所給題目意思和示例,可知從n個種抽取m個數是可以抽到同一個數的。
從n個種抽m個數——抽到的數完全不同時有;
從n個種抽m個數——抽到的數有兩個數相同時有,即:先從n個數中抽取一個數作爲重複數,再從剩下的n-1個數種抽取m-2個不同的數;
從n個種抽m個數——抽到的數有三個數相同時有,即:先從n個數中抽取一個數作爲重複數,再從剩下的n-1個數種抽取m-3個不同的數;
同理……
當從n個種抽m個數——抽到的數有m-1個數相同時有,即:先從n個數中抽取一個數作爲重複數,再從剩下的n-1個數種抽取m-3個不同的數;
當從n個種抽m個數——抽到的數有m個數相同時有,即:先從n個數中抽取一個數作爲重複數,再從剩下的n-1個數種抽取m-3個不同的數;
將全部情況相加便得到最終的結果。
#定義階乘函數:n!
def D(n):
a=1
if n==1:
return 1
for i in range(1,n+1):
a=a*i
return a
#定義組合數計算函數:C(n,m)=n!/[m!*(n-m)!]
def C(n,m):
return (D(n)//(D(m)*D(n-m)))
n,m=input().split()
n=int(n)
m=int(m)
if 20000>=n>=1 and 1<=m<=10000:
num2=0
for i in range(m-1):
num2+=n*C(n-1,i)
num2+=C(n,m)
print(num2%1000000007)
然而,在寫文章的時候,突然發現,這裏忽略圈爲劃分重複組合的唯一一個限制條件,也就是說,當m大於3時候,存在其他滿足條件的組合沒有算進去,而這些組合並未重複,例如:
n=5,m=5時,12435與12345是不算重複的,而上面的方法缺少了對這類情況的考慮。。(我太難了)