小Q的歌單(2)

2021-09-25 16:28:07 字數 1100 閱讀 1117

小q有x首長為a的不同的歌和長為y首長度為b的不同的歌,從種選取任意首,組成長度為k的歌單,每首歌只能被選取一次,不考慮歌單內歌曲的先後順序,問有多少種組成方法。

第一行是乙個整數,表示歌單的總長度為k。

第二行有四個整數,a(<=10)、x(<=100)、b(<=10)、y(<=100),分別代表第一種長度和數量,第二種長度和數量,保證a!=b。

輸出為乙個整數,表示組成方式有多少種,若輸出結果過大,則對該數進行1000000007(中間8個0)取模的結果作為最終結果。

2 3 3 3

第一種歌的長度為a,一共有x首,假設從裡面選區m首,則有c1(m,x)種選法,同理第二種歌的長度為b,一共有y首,假設從裡面選區n首,則一共有c2(n,y)種選法,然後將c1和c2進行相乘,結果則為最終結果(若太大則進行取模)。

這是一道典型的排列組合問題中的排列問題,如果不考慮計算量和超出整型範圍問題,則直接可以通過公式計算得出最終的結果。但是,假設第一種歌有100首,從裡面取出50首,進行組合計算則是c(50,100),這個數明顯太大。

對資料進行分析,若為1首歌,有選0首和選1首兩種狀態;若為2首歌,有選0首、選1首、選2首三種狀態,對應的種類分別為1 2 1;若為3首歌,有選0首、1首、2首、3首,對應的種類為1 3 3 1,以此類推。。。觀察種類組成結構:

1 11 2 1

1 3 3 1

1 4 6 4 1

若將最上面一排按上1,則剛好滿足楊輝三角,第n行(從第0行開始)的第m個數剛好是c(m,n),c(m,n)剛好等於左上角c(m-1,n-1)和正上方c(m,n-1),第一列除外,第一列全部為1。若用二維陣列表示則c[n][m] = c[n-1][m-1] + c[n-1][m]。這種方法增加了一定的空間消耗,大大降低了時間複雜度和計算複雜度。

#include #include using namespace std;

int** init(const int len)

} return brr;

}int getmod(int a)

void test()

} }printf("%lld\n", ans);

}int main()

騰訊筆試 小Q的歌單

時間限制 1秒 空間限制 32768k 小q有x首長度為a的不同的歌和y首長度為b的不同的歌,現在小q想用這些歌組成乙個總長度正好為k的歌單,每首歌最多只能在歌單 現一次,在不考慮歌單內歌曲的先後順序的情況下,請問有多少種組成歌單的方法。輸入描述 每個輸入包含乙個測試用例。每個測試用例的第一行包含乙...

騰訊筆試題 小Q的歌單

題目描述 小q有x首長度為a的不同的歌和y首長度為b的不同的歌,現在小q想用這些歌組成乙個總長度正好為k的歌單,每首歌最多只能在歌單中出現一次,在不考慮歌單內歌曲的先後順序的情況下,請問有多少種組成歌單的方法。輸入描述 每個輸入包含乙個測試用例 每個測試的第一行包含乙個整數,表示歌單的總長度k 1 ...

小Q的歌單 騰訊2018秋招

題目描述 小q有x首長度為a的不同的歌和y首長度為b的不同的歌,現在小q想用這些歌組成乙個總長度正好為k的歌單,每首歌最多只能在歌單 現一次,在不考慮歌單內歌曲的先後順序的情況下,請問有多少種組成歌單的方法。輸入描述 每個輸入包含乙個測試用例 每個測試的第一行包含乙個整數,表示歌單的總長度k 1 k...