洛谷 P2513 HAOI2009 逆序對數列

2022-05-12 18:34:22 字數 2478 閱讀 5499

對於乙個數列,如果有iaj,那麼我們稱ai與aj為一對逆序對數。若對於任意乙個由1~n自然數組成的數列,可以很容易求出有多少個逆序對數。那麼逆序對數為k的這樣自然數數列到底有多少個?

輸入格式:

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

輸出格式:

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

輸入樣例#1:

4 1

輸出樣例#1:

3

樣例說明:

下列3個數列逆序對數都為1;分別是1 2 4 3 ;1 3 2 4 ;2 1 3 4;

測試資料範圍

30%的資料 n<=12

100%的資料 n<=1000,k<=1000

一道簡單題,但我覺得可以做到更大的資料,比方說加兩個0

從小到大考慮每一位,先考慮1,如果1位於i這個位置,那1與1~i-1這些位置的每乙個數都會產生乙個逆序對,與i+1~n這些位置的數都不會產生逆序對,至於具體每個數字是什麼對於1的貢獻沒有影響

然後從排列裡把1去掉,變成乙個2~n的排列,這個排列與1~n-1的排列是等價的,於是問題轉化成了乙個較小的問題

然後可以dp

dp[i][j]表示1~i的排列,要有j個逆序對的方法數,列舉當前位置產生的逆序對來轉移,這個東西本來是nk^2的,但是發現乙個位置轉移的時候是連續的一段,用字首和優化去掉乙個k即可

其實這個問題等價於有n個帶編號的盒子排成一列,一共放k個球,標號為i的盒子裡不能放超過i-1個球,求方法總數,這應該是有更好的做法的

upd1:這個東西的生成函式是 $ (1)(1+x)(1+x+x^2)(1+x+x^2+x^3)...(1+x+x^2+...+x^) $ 即 $ \prod_^\sum_^x^q $ ,這個形式過於美妙讓人很難不認為它有乙個優美的通解

1 #include 2 #include 3 #include 4 #include 5 #include 

6 #include 7 #include 8 #include 9 #include 10 #include

11 #include 12 #include 13 #include 14

#define eps 1e-7

15#define inf 0x3f3f3f3f

16#define mod 10000

17#define rep0(j,n) for(int j=0;j18

#define rep1(j,n) for(int j=1;j<=n;++j)

19#define pb push_back

20#define mp make_pair

21#define set0(n) memset(n,0,sizeof(n))

22#define ll long long

23#define ull unsigned long long

24#define iter(i,v) for(edge *i=head[v];i;i=i->nxt)

25#define max(a,b) (a>b?a:b)

26#define min(a,b) (a27

#define print_runtime printf("running time:%.3lfs\n",double(clock())/1000.0)

28#define to(j) printf(#j": %d\n",j);

29//

#define oj

30using

namespace

std;

31const

int maxint = 100010;32

const

int maxnode = 100010;33

const

int maxedge = 2*maxnode;

34char buf,*buf;

35int

read()

38while(isdigit(c))

39return f*x;40}

41char

get_ch()

46//

------------------- head files ----------------------

//47

48int

n,k;

49int dp[10010],sum[10010

];50

void

get_input();

51void

work();

52int

main()

57void

work()

63 sum[0]=dp[0

];64

rep1(j,k)67}

68 printf("

%d\n

",(dp[k]+mod)%mod);69}

70void

get_input()

P2513 HAOI2009 逆序對數列

題目描述 對於乙個數列,如果有iaj,那麼我們稱ai與aj為一對逆序對數。若對於任意乙個由1 n自然數組成的數列,可以很容易求出有多少個逆序對數。那麼逆序對數為k的這樣自然數數列到底有多少個?錯誤日誌 沒想対,菜是原罪,最近狀態不佳 在一段 1 i 1 的排列中加入 i 你可以控制 i 插入的位置,...

P2513 HAOI2009 逆序對數列

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

P2513 HAOI2009 逆序對數列

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