博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
51nod 1020
阅读量:4452 次
发布时间:2019-06-07

本文共 1282 字,大约阅读时间需要 4 分钟。

求 $n$ 个数的排列中逆序数为 $k$ 的排列数

$f[n][k]$ 表示 $n$ 个数的排列中逆序数为 $k$ 的排列数
$f[n][k] = \sum_{i = 0}^{n - 1} f[n - 1][k - i]$
考虑当前 $n - 1$ 的排列中有 $k - i$ 个逆序对
那么对于 $n$ 的排列,把最大数放到倒数第 $i$ 个数前,就会增加 $i$ 个逆序对
同理 $f[n][k - 1] = \sum_{i = 0} ^ {n - 1} f[n - 1][k - 1 - i]$
两式相减

\begin{array}{l}

f[n][k] - f[n][k - 1] \\
= \sum_{i = 0}^{n - 1} f[n - 1][k - i] - \sum_{i = 0} ^ {n - 1} f[n - 1][k - 1 - i] \\
= f[n - 1][k] - f[n - 1][k - n]
\end{array}

then 地推公式为

$f[n][k] = f[n][k - 1] + f[n - 1][k] - f[n - 1][k - n]$

#include 
#define gc getchar()inline int read() { int x = 0; char c = gc; while(c < '0' || c > '9') c = gc; while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = gc; return x;} int f[(int)1e3 + 10][(int)1e3 + 10];const int Mod = 10000;void Work() { int n = (int)1e3; for(int i = 1; i <= n; i ++) f[i][0] = 1; for(int i = 2; i <= n; i ++) { for(int j = 1; j <= i * (i - 1) / 2 && j <= (int)1e3; j ++) { f[i][j] = (f[i][j] + f[i][j - 1] + f[i - 1][j]) % Mod; if(j - i >= 0) f[i][j] -= f[i - 1][j - i]; f[i][j] = (f[i][j] + Mod) % Mod; } }}int main() { Work(); int T = read(); for(; T; T --) printf("%d\n", f[read()][read()]); return 0;}

 

转载于:https://www.cnblogs.com/shandongs1/p/9445249.html

你可能感兴趣的文章
DispatcherServlet的url mapping为“/”时,对根路径访问的处理
查看>>
备忘pwnable.kr 之passcode
查看>>
好久没敲代码了,手有点生——一个小小的时钟
查看>>
运算符 AS和IS 的区别
查看>>
(转)详解C中volatile关键字
查看>>
easyui时的时间格式yyyy-MM-dd与yyyy-MM-ddd HH:mm:ss
查看>>
专题:动态内存分配----基础概念篇
查看>>
Codeforces Round #426 (Div. 2) (A B C)
查看>>
The Most Simple Introduction to Hypothesis Testing
查看>>
UVA10791
查看>>
P2664 树上游戏
查看>>
jQuery 停止动画
查看>>
Sharepoint Solution Gallery Active Solution时激活按钮灰色不可用的解决方法
查看>>
MyBatis Generator去掉生成的注解
查看>>
教你50招提升ASP.NET性能(二十二):利用.NET 4.5异步结构
查看>>
lua连续随机数
查看>>
checkstyle使用介绍
查看>>
history.js 一个无刷新就可改变浏览器栏地址的插件(不依赖jquery)
查看>>
会了这十种Python优雅的写法,让你工作效率翻十倍,一人顶十人用!
查看>>
二维码图片生成
查看>>