51nod 1020
求 $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 <bits/stdc++.h>
#define gc getchar()
inline int read() {
int x = ; char c = gc;
while(c < '' || c > '') c = gc;
while(c >= '' && c <= '') x = x * + c - '', c = gc;
return x;
}
int f[(int)1e3 + ][(int)1e3 + ];
const int Mod = ;
void Work() {
int n = (int)1e3;
for(int i = ; i <= n; i ++) f[i][] = ;
for(int i = ; i <= n; i ++) {
for(int j = ; j <= i * (i - ) / && j <= (int)1e3; j ++) {
f[i][j] = (f[i][j] + f[i][j - ] + f[i - ][j]) % Mod;
if(j - i >= ) f[i][j] -= f[i - ][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 ;
}
51nod 1020的更多相关文章
- 51nod 1020 逆序排列
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1020 题意: 思路: 一开始用了三重循环... 设f(n,k)表示n个数 ...
- 51nod 1020 逆序排列(dp,递推)
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1020 题意:是中文题. 题解:很显然要设dp[i][j]表示 ...
- 51nod 1020 逆序排列 递推DP
1020 逆序排列 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 关注 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么 ...
- 51nod 1020 逆序排列 DP
在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中逆序的总数就称为这个排列的逆序数. 如2 4 3 1中,2 1,4 3,4 1,3 1是逆序 ...
- 51nod 1020 逆序排列——dp
在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中逆序的总数就称为这个排列的逆序数. 如2 4 3 1中,2 1,4 3,4 1,3 1是逆序 ...
- 51nod水题记
妈呀51nod已经刷不动了又开始跟bzoj一样总是得看题解了...那么发一下总结吧... 1051:最大子矩阵 #include<cstdio> #include<cstring&g ...
- 【51Nod 1244】莫比乌斯函数之和
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1244 模板题... 杜教筛和基于质因子分解的筛法都写了一下模板. 杜教筛 ...
- 51Nod 1268 和为K的组合
51Nod 1268 和为K的组合 1268 和为K的组合 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 给出N个正整数组成的数组A,求能否从中选出若干个,使 ...
- 51Nod 1428 活动安排问题
51Nod 1428 活动安排问题 Link: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1428 1428 活 ...
随机推荐
- python中检测某个变量是否有定义
目录 第一种方法使用内置函数locals() 第二种方法使用内置函数dir() 第三种方法使用内置函数vars() 第一种方法使用内置函数locals() 'testvar' in locals(). ...
- S04_CH01_搭建工程移植LINUX/测试EMMC/VGA
S04_CH01_搭建工程移植LINUX/测试EMMC/VGA 1.1概述: 本章内容是在已经提供安装了VIVADO2015.4 的ubuntu系统下,进行.大家可以下周我们已经提供的虚拟机镜像,我们 ...
- MyBatis_01 框架
Mybatis概述 Mybatis是什么 Mybatis是一个持久层框架. Mybatis的作用 Mybatis是一个持久层框架,当然作用就是操作数据库的(增删改查). 为什么需要学习Myba ...
- (八)Struts标签基础(一)
一.Struts标签分类 二.标签的使用 2.1 标签的主题 主题的设置与struts.xml中的常量<constant name="struts.ui.theme" val ...
- Linux 配置jdk vim和 Linux 基本操作
1下载jdk tar.gz 安装包(http://www.oracle.com/) 注意安装机器的Linux 是x86(32位)还是x64(64位)的 2使用tar -zxvf jdk.tar.gz解 ...
- Python练习_集合和深浅拷贝_day7
1. 1.作业 1.把列表中所有姓周的人的信息删掉(升级题:此题有坑, 请慎重): lst = ['周老二', '周星星', '麻花藤', '周扒皮'] 结果: lst = ['麻花藤'] 2.车牌区 ...
- TODO页面
功能:1.根据数据显示当前所未完成的事件, 2.可通过输入框进行事件的添加,可标记已完成的事件并进行删除,可修改已添加的事件. ps:插件引入均使用本地文件,需改用静态CDN. 效果: 代码实现: & ...
- kbmMW 5.10.01试用报告
1.FileClient.SameFile 调用这个方法,当本地文件不存在时,会一直等待.跟踪代码,发现: function TkbmMWCustomFileClient.SameFileEx(Loc ...
- java利用MultipartRequest的getFileName方法不能得到原文件名问题
想利用MultipartRequest的getFileName方法来一次获取多个上传的文件名字时,得到的不是文件的名字,而是 input 的name属性 最后找到了答案,解决方法,参照http://s ...
- Computer Vision_18_Image Stitching: Image Alignment and Stitching A Tutorial——2006(book)
此部分是计算机视觉部分,主要侧重在底层特征提取,视频分析,跟踪,目标检测和识别方面等方面.对于自己不太熟悉的领域比如摄像机标定和立体视觉,仅仅列出上google上引用次数比较多的文献.有一些刚刚出版的 ...