逆序對數列

2022-02-26 14:22:25 字數 990 閱讀 8038

【題目描述】

對於乙個數列,如果有ia[j],那麼我們稱a[i]與a[j]為一對逆序對數。若對於任意乙個由1~n自然數組成的數列,可以很容易求出有多少個逆序對數。詢問逆序對數為k的這樣自然數數列到底有多少個。

【輸入描述】

第一行為兩個整數n、k。

【輸出描述】

寫入乙個整數,表示符合條件的數列個數,由於這個數可能很大,你只需輸出該數對10000求餘數後的結果。

【輸入樣例】

4 1【輸出樣例】

3【資料範圍】

下列3個數列逆序對數都為1,分別是:

1 2 4 3

1 3 2 4

2 1 3 4

n <= 1000,k <= 1000。

bzoj的資料太水了,o(m*n^2)的普通解法竟然過了:

源**:

#include

int m,n,f[1001][1001]=;

intmain()

/*挺簡單的dp:

f[i][j]表示1~i個自然數所組合成的、逆序對數為j的數列個數。

在1~i中,i即為最大,故將它安插到某一位置,其後方的所有數都會與它形成逆序對。

由上可得狀態轉移方程:

f[i][j] = ∑f[i-1][j-i+k],(1 <= k <= i)。

*/

滾動陣列+字首和優化後的o(mn)解法:

源**:

#include

int m,n,sum[1001],f[1001

];int

main()

else

f[b]=sum[b];

for (int b=1;b<=m;b++) //

字首和處理。

sum[b]=(sum[b-1]+f[b])%10000

; }

printf("%d

",f[m]);

return0;

}

BZOJ 2431 逆序對數列

time limit 5 sec memory limit 128 mb submit 2611 solved 1526 submit status discuss description 對於乙個數列,如果有i aj,那麼我們稱ai與aj為一對逆序對數。若對於任意乙個由1 n自然數組成的 數列,可...

HAOI 2009 逆序對數列

haoi 2009 逆序對數列 對於乙個數列,如果有iaj,那麼我們稱ai與aj為一對逆序對數。若對於任意乙個由1 n自然數組成的 數列,可以很容易求出有多少個逆序對數。那麼逆序對數為k的這樣自然數數列到底有多少個?第一行為兩個整數n,k。寫入乙個整數,表示符合條件的數列個數,由於這個數可能很大,你...

HAOI2009 逆序對數列

題目大意 求 1,n 的自然數的排列中逆序對數為 k 的有多少.無優化 include include const int mod 10000 int f 1005 1005 int main printf d n f n k return 0 優化 include include const in...