51nod 1020 逆序排列
Posted rosebud
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51nod 1020 逆序排列相关的知识,希望对你有一定的参考价值。
题意是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 ", (f[a][b] + M) % M); } return 0; }
以上是关于51nod 1020 逆序排列的主要内容,如果未能解决你的问题,请参考以下文章