码迷,mamicode.com
首页 > 其他好文 > 详细

51nod 1020 逆序排列

时间:2018-10-19 16:47:41      阅读:123      评论:0      收藏:0      [点我收藏+]

标签:--   scan   question   htm   can   printf   amp   html   情况   

题目戳这里

题意是n个数字,问逆序对为k的排列有多少种。

令f(n,k)表示n个数时,逆序对为k的排列种数。考虑k个逆序对时,第n个数字的放置的情况:

这第n个数可以插入的位置为n-i,其中i∈[0,n-1],插在第n-i个位置,则产生i个逆序对,不插入时,n-1个数则恢复成k-i个逆序对。

则有f(n,k)=∑f(n-1,k-i) 其中i∈[0,n-1] ,为了消去这个求和,同理:

f(n,k-1)=∑f(n-1,k-1-i),上下两式相减,然后移项可得: f(n,k)=f(n,k-1)+f(n-1,k)-f(n-1,k-n)。dp即可:

#include <stdio.h>
const int M=1e9+7;
int cas, a, b, f[1005][20005];

void init() {
  for (int i = 1; i <= 1000; ++i)
    f[i][0] = 1;
  for (int n = 2; n <= 1000; ++n) {
    for (int k = 1; k <= 20000; ++k) {
      f[n][k] = (f[n][k - 1] + f[n - 1][k]) % M;
      if (k - n >= 0)
        f[n][k] = (f[n][k] - f[n - 1][k - n]) % M;
    }
  }
}
int main () {
  init();
  scanf("%d", &cas);
  while (cas--) {
    scanf("%d%d", &a, &b);
    printf("%d\n", (f[a][b] + M) % M);
  }
  return 0;
}

 

51nod 1020 逆序排列

标签:--   scan   question   htm   can   printf   amp   html   情况   

原文地址:https://www.cnblogs.com/Rosebud/p/9817143.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!