牛客 出題的訣竅(統計次數)

2021-09-16 12:55:58 字數 885 閱讀 1937

出題的訣竅

思路:這道題目如果不考慮重複就很簡單了,就是先求出總和sum,ans = sum*m^(n-1)(這裡我n表示行數,m表示列數,

與題中給出的n,m表示的意義不同)。

考慮重複的就是對每一行進行考慮,對每一行的每乙個元素x進行計算,

用序列a1,a2,a3……ai……an表示元素x在前i行(1-i行)出現的次數,(求解ai可以用a2 = a1*k,k表示在第i行x出現的次數)

所以每行的不同元素x對整個排序的貢獻是(m-a1)*(m-a2)*(m-a3)……(m-ai-1)*ai*x*m^(n-i),

其中m*(n-i)表示後面的元素序列的組合,(這裡不用考慮後面重複的元素,因為就算選到了的相同的元素也只算當前的

元素個數,後面的不算,以樣例中的的3為例,只有

(1,3,1),(1,3,3),(2,3,1),(2,2,3),四種情況,其中我們統計第二行3時會統計(1,3,1),(1,3,3),(2,3,1),(2,2,3)四種情況,所以3出現4次,而且後面的3也沒算,因為這裡統計的只是當前的3,再統計第三行的3時會統計到

(1,2,3),(2,2,3)兩種情況。

具體細節參見**:

#include#include#include#includeusing namespace std;

typedef long long ll;

const int maxn = 4000400;

const ll mod = 1e9+7;

ll dd[maxn]=;

struct node

node(){}

}cur[maxn];

bool cmp(node a,node b){

if(a.data!=b.data) return a.data參考文章

牛客練習賽42 C 出題的訣竅

這個題就是對於每個數算貢獻,如果有相同的數,只計算先出現的數的貢獻 對於數x,若它在前i行的數目分別為a1,a2.ai。則這個數的貢獻應為 ai x n a1 n a2 n a i 1 n m i 次方。這樣想,如果不要求不重複算,那大小就直接是ai n m 1 了 n a1 n a2 n a i ...

牛客練習賽42 出題的訣竅(數學 hash)

出題的訣竅 題解 由於他是在每一行選取乙個元素,然後縱向來比較,這裡行的順序是不會影響的,所以我們將每乙個數存入雜湊表中,然後對每乙個數來進行考慮。第一行的數,對答案的貢獻為mn 1,而第二行對答案的貢獻為mn 2 m 1 以此類推。這裡注意對同一行有多個相同元素的情況考慮一下。如下 include...

搜尋出字串中出現次數最多的字元,並統計次數

今天看到一道題,搜尋出字串中出現次數最多的字元,並統計其次數,就自己動手寫一下,是用遞迴來實現的,原理是這樣的 每一次都取出字串str的第乙個字元fs,統計出其在字串str中出現的次數n,然後把字串str中的fs刪除,一直到字串str的長度小於n。1 varstr aaaa13123aass1231...