2019華爲某筆試題篇——事情沒有那麼簡單?

題目:

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個數——抽到的數完全不同時有C_{n}^{m}

從n個種抽m個數——抽到的數有兩個數相同時C_{n}^{1}C_{n-1}^{m-2}有,即:先從n個數中抽取一個數作爲重複數,再從剩下的n-1個數種抽取m-2個不同的數;

從n個種抽m個數——抽到的數有三個數相同時C_{n}^{1}C_{n-1}^{m-3}有,即:先從n個數中抽取一個數作爲重複數,再從剩下的n-1個數種抽取m-3個不同的數;

同理……

當從n個種抽m個數——抽到的數有m-1個數相同時C_{n}^{1}C_{n-1}^{1}有,即:先從n個數中抽取一個數作爲重複數,再從剩下的n-1個數種抽取m-3個不同的數;

當從n個種抽m個數——抽到的數有m個數相同時C_{n}^{1}C_{n-1}^{0}有,即:先從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是不算重複的,而上面的方法缺少了對這類情況的考慮。。(我太難了)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章