bzoj2431 HAOI2009 逆序對數列

2021-07-30 12:43:47 字數 741 閱讀 4574

dp……

令b[i][j]表示n=i,k=j時的答案;

則b[1][0]=1;b[2][0]=1;b[2][1]=1;b[3][0]=1;b[3][1]=2;b[3][2]=2;b[3][3]=1;

我們觀察發現(至少我是觀察)b[i][j]=b[i-1][j-i+1]+……b[i-1][j];

注意j-i+1<0時令其為0;j>(i-1)*(i-2)/2,即j大於i-1層逆序對最大值時,b[i][j]=b[i-1][j-i+1]+……b[i-1][n];

發現有聯絡區間和則

令a[i][j]表示n=i時,k=1到j所有答案的和

首先發現a[i][0]都為1;

最終a[i][j]=a[i][j-1]+a[i-1][j]-a[i-1][j-i];注意到之前提到的問題就好

答案就是a[n][k]-a[n][k-1];

#include#include#include#include#include#includeusing namespace std;

int n,k;

int a[1005][1005];

int main()}}

printf("%d",(a[n][k]-a[n][k-1]+10000)%10000);

return 0;

}

bzoj2431 HAOI2009 逆序對數列

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

bzoj2431 HAOI2009 逆序對數列

天哪天哪天哪 我們用f i j 來表示前i個數,有j對逆序對的方案數,so考慮插入,因為i比1到i 1裡面的任何乙個數都要大,所以插入的時候後面有多少個數,就會多出多少逆序對,所以前面的符合條件的都可以轉移,f i j sigma f i 1 j k k屬於0到i 1,然而字首和神煩.include...

BZOJ2431 HAOI2009 逆序對數列

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