1. 程式人生 > >BZOJ-2431: [HAOI2009]逆序對數列 (傻逼遞推)

BZOJ-2431: [HAOI2009]逆序對數列 (傻逼遞推)

submit day 數列 ont led center zoj status ref

2431: [HAOI2009]逆序對數列

Time Limit: 5 Sec Memory Limit: 128 MB
Submit: 2401 Solved: 1389
[Submit][Status][Discuss]

Description

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

Input

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

Output

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

Sample Input

4 1

Sample Output

3

樣例說明:
下列3個數列逆序對數都為1;分別是1 2 4 3 ;1 3 2 4 ;2 1 3 4;
100%的數據 n<=1000,k<=1000

HINT

Source

Day1

f[i][j]=Σf[i-1][j-k] k∈[0,i) 求和用和數組存一下,f[i][j]只與前一行有關系,所以開滾動數組
 1 #include "bits/stdc++.h"
 2 using namespace std;
 3 typedef long long LL;
 4 const int MAX=1005,MOD=1e4;
5 int n,m,f[MAX],s[MAX]; 6 int main(){ 7 freopen ("num.in","r",stdin);freopen ("num.out","w",stdout); 8 int i,j; 9 scanf("%d%d",&n,&m); 10 for (i=0;i<=m;i++) s[i]=1; 11 for (i=2;i<=n;i++){ 12 f[0]=1; 13 for (j=1;j<=m;j++) 14 if (j>=i) f[j]=(s[j]-s[j-i]+MOD)%MOD;
15 else f[j]=s[j]%MOD; 16 for (j=1;j<=m;j++) 17 s[j]=(s[j-1]+f[j])%MOD; 18 } 19 printf("%d",f[m]); 20 return 0; 21 }

BZOJ-2431: [HAOI2009]逆序對數列 (傻逼遞推)