最大數的和

2022-05-01 10:42:05 字數 1125 閱讀 1140

題意:有n個數,每次從中任意選取k個數,取其中的最大值,求所有組合能取得的最大值的和.n≤100,000,k≤50,輸出結果對1000000007取模的結果.0≤每個數≤10^​9​​

樣例輸入1

5 2

1 2 3 4 5

樣例輸出1

40

樣例輸入2

5 3

1 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 輸出每組...