不等數列

【題目描述】ios

將1到n任意排列,而後在排列的每兩個數之間根據他們的大小關係插入「>」和「<」。問在全部排列中,有多少個排列剛好有k個「<」。答案對2012取模。ide

 

【輸入格式】spa

第一行2個整數n,k。it

 

【輸出格式】io

一個整數表示答案。class

 

【樣例輸入】stream

5 2im

【樣例輸出】數據

66img

【數據範圍】

對於30%的數據:n <= 10

對於100%的數據:k < n <= 1000,

 

/*
  f[i][j]向前i位數中插入j個'<’種數
      當咱們向長爲i-1序列中插入第i個數時,當插入一個'<'中或序列左端時,
  '<'數量不變,'>'數量+1,且能夠插入的位置有j+1個;當插入一個'>'中或
  序列右端時,'>'數量不變,'<'數量+1,且能夠插入的位置有i-j個。
      可得遞推公式:
          f[i][j]=f[i-1][j]*(j+1)+f[i-1][j-1]*(i-j) 
*/
#include<cstdio>
#include<iostream>
#define M 1010
using namespace std;
int f[M][M];
int main()
{
    int n,k;
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++)
      f[i][0]=1;
    for(int i=2;i<=n;i++)
      for(int j=1;j<=i-1;j++)
      {
          f[i][j]=f[i-1][j]*(j+1)+f[i-1][j-1]*(i-j);
          f[i][j]%=2012;
      }
       
    printf("%d",f[n][k]);
    return 0;
}
View Code
相關文章
相關標籤/搜索