[模拟赛] T2 不等数列

Description

将1到n任意排列,然后在排列的每两个数之间根据他们的大小关系插入“>”和“<”。问在所有排列中,有多少个排列恰好有k个“<”。答案对2015取模。

注:1~n的排列指的是1~n这n个数各出现且仅出现一次的数列。

Input

第一行2个整数n,k。

Output

一个整数表示答案。

Range

对于30%的数据:n <= 10

对于100%的数据:k < n <= 1000

Solution

dp找规律题

我们设 f[i][j] 表示 i 个数有 j 个 < 的方案数

接下来考虑放第 i+1 个数

可以观察到,如果放到 > 旁边,会额外产生一个 <;如果放到 < 旁边,会额外产生一个 >

我们又知道,对于 i 个数有 j 个<,就有 (i-1-j) 个>

那么转移方程就推出来了

f[i][j]=(j+1)*f[i-1][j]+(i-j)*f[i-1][j-1]

Code

#include<cstdio>
#define mod 2015
using namespace std;

int n,k;
int f[1005][1005];

signed main(){
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++){
        f[i][0]=1;
        for(int j=1;j<n;j++)
            f[i][j]=f[i-1][j]*(j+1)+f[i-1][j-1]*(i-j),f[i][j]%=mod;
    }
    printf("%d",f[n][k]%mod);
    return 0;
}

原文地址:https://www.cnblogs.com/YoungNeal/p/8495940.html

时间: 2024-09-30 16:07:22

[模拟赛] T2 不等数列的相关文章

2017 9 11 noip模拟赛T2

#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=205; int map[N][N]; int d[N],tag[N],book[N],f[N]; int n,m; void work(int x) { memset(d,63,sizeof(d)); memset(book,0,sizeof(book)); memset(f,0,sizeof(

20180530模拟赛T2——绀碧之棺

题目背景Background qiancl 得到了一张藏宝图,上面写了一道谜题. 题目描述 Description 定义\(F(n)\)为 n 在十进制下各个数位的平方和,求区间\([a,b]\)中有多少\(n\)满足\(k\times F(n) = n\). 输入描述 (coffin.in) Input Description 一行三个正整数\(k,a,b\). 输出描述 (coffin.out) Output Description 一行一个整数表示满足条件的\(n\)的个数. 样例输入Sa

18.9.20模拟赛T2 城市 枚举

题目大意:给出$N$个数两两的和共$\frac{N \times (N-1)}{2}$个数,请你求出原来的$N$个数输入:第一行一个数$N$,第二行$\frac{N \times (N-1)}{2}$个数表示两两之和(不保证有序)输出:第一行为可行解个数$K$,接下来$K$行每行一个方案,每一个方案的数字从小到大输出,中间有一个空格:方案按字典序从大到小输出.sample input:4 3 6 5 4 5 7 sample output:11 2 3 4数据范围:$2 \leq N \leq

[10.4模拟赛]T2

T2 Description 现有一个\(n\)个点,\(m\)条无向边的图.要求求出从编号为\(1\)的点到编号为\(n\)的点经过的边的边权的绝对值之和最小的路径.特别的,每经过一条边,图上所有边的边权就会改变,若原边权为x,新的边权是\(\frac{1}{1-x}\). 答案保留3位小数 Input 第一行两个整数\(m\),\(n\),表示点数和边数. 接下来\(m\)行,每行三个整数\(u\),\(v\),\(x\),表示有一条连接\(u\),\(v\),边权位\(x\). Outpu

字符串模拟赛T2

// source code from laekov for c0x17 #define PRID "fkqh" #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 200009; int n, l[maxn], q[maxn], vx[maxn], vy[maxn]; char a[maxn]; void ma

20161022 NOIP模拟赛 T2 解题报告

旅行者问题 [问题描述] lahub是一个旅行者的粉丝,他想成为一个真正的旅行者,所以他计划开始一段旅行.lahub想去参观n个目的地(都在一条直道上).lahub在起点开始他的旅行.第i个目的地和起点的距离为ai千米(ai为非负整数).不存在两个目的地和起点的距离相同. 从第i个目的地走到第j个目的地所走的路程为 |ai-aj|千米.我们把参观n个目的地的顺序称作一次“旅行”.lahub可以参观他想要参观的任意顺序,但是每个目的地有且只能被参观一次(参观顺序为n的排列). lahub把所有可能

11.12 模拟赛T2 冒泡排序图

[问题描述] 有一段使用冒泡排序产生一张图的伪代码如下:function bubbleSortGraph(n, a[]): graph = emptyGraph() repeat swapped = false for i = 1 to n - 1:  if a[i] > a[i + 1]: graph.addEdge(a[i], a[i + 1]) swap(a[i], a[i + 1]) swapped = true until not swapped return graph函数的输入为长

洛谷 U361 序列操作(NOIP模拟赛T2)

题目链接:https://www.luogu.org/problem/show?pid=U361 题目背景 夏令营 题目描述 小B有一个整数序列a[1..N],初始时序列中所有元素均为0.他会在序列上进行下面两种操作,操作共M个: A l r x:将a[l..r]均加上x. Q l r:询问a[l..r]中的最大值. 输入输出格式 输入格式: 第一行,两个整数N, M. 接下来的M行,每行一个操作. 输出格式: 设询问操作有T个,则输出T行,每行一个整数,表示询问操作对应的答案. 输入输出样例

2017/9/3模拟赛T2

题解:由于题目已经提示我们这是个单峰函数,所以很容易想到三分法,所以我们就枚举中位数,为保证平均数最大,左右两侧都从右往左取数. 代码如下: 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #define MN 100005 5 using namespace std; 6 int n,a[MN],maxl,l,r,lm,rm; 7 long long sum[MN]; 8 double a