題意:有n個數,每次從中任意選取k個數,取其中的最大值,求所有組合能取得的最大值的和.n≤100,000,k≤50,輸出結果對1000000007取模的結果.0≤每個數≤10^9
樣例輸入1
5 21 2 3 4 5
樣例輸出1
40
樣例輸入2
5 31 2 3 4 5
樣例輸出2
45
分析:很顯然,這是一道組合數學的題目。其實我們只需要求出每個數作為最大值出現的次數就能夠得到答案.如果乙個數能夠作為最大值出現,那麼這個數肯定大於等於第k大的數,先排序.
我們要找到當前數作為最大數的次數,這由比他小的數來決定.對於樣例2,我們考慮3這個數,將3固定在最高位,那麼我們還需要確定k-1個數,這k-1個數可以取任意的比3小的數,例如1,2或2,1兩個組合,也就是說如果我們當前考慮的數是第i大的數,那麼只需要計算出c[i-1][k-1](i-1個數中選k-1個數的方案個數)再乘以這個數即可.
然而,本題要求取模,不能直接計算組合數,可以使用逆元來計算,但是這樣有點複雜,如果我們直接遞推則可以直接取模(不涉及到除法),這樣有乙個問題:記憶體占用太大,這道題用long long,開陣列記憶體花費太大了,怎麼辦呢?可以發現遞推組合數的時候狀態i的結果只與狀態i-1的結果有關,所以可以使用滾動陣列!**如下:
#include#include#include
#define maxn 100010
using
namespace
std;
const
int mod = 1e9 + 7
;long
long
p[maxn];
long
long f[2
][maxn];
long
long
ans;
intk, n;
void
work()
if (k - 1
<=i)
ans += p[i + 1] * f[flag][k - 1] %mod;
ans %=mod;
flag = !flag;}}
intmain()
尋找最大數
描述 請在整數 n 中刪除m個數字,使得餘下的數字按原次序組成的新數最大,比如當n 92081346718538,m 10時,則新的最大數是9888 輸入 第一行輸入乙個正整數t,表示有t組測試資料 每組測試資料佔一行,每行有兩個數n,m n可能是乙個很大的整數,但其位數不超過100位,並且保證資料...
尋找最大數
時間限制 1000 ms 記憶體限制 65535 kb 難度 2 描述 請在整數 n 中刪除m個數字,使得餘下的數字按原次序組成的新數最大,比如當n 92081346718538,m 10時,則新的最大數是9888 輸入 第一行輸入乙個正整數t,表示有t組測試資料 每組測試資料佔一行,每行有兩個數n...
尋找最大數
尋找最大數 三 時間限制 1000 ms 記憶體限制 65535 kb 難度 2 描述給出乙個整數n,每次可以移動2個相鄰數字上的數字,最多移動k次,得到乙個新的整數。求這個新的整數的最大值是多少。輸入多組測試資料。每組測試資料佔一行,每行有兩個數n和k 1 n 10 18 0 k 100 輸出每組...