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求餘數...