本省省选题是需要做的。

题目传送门:洛谷P4609

题意简述:

求有多少个 \(1\) 到 \(N\) 的排列,满足比之前的所有数都大的数正好有 \(A\) 个,比之后的所有数都大的数正好有 \(B\) 个。

答案对 \(mod=10^9+7\) 取模。

有 \(T\) 组数据。

题解:

考虑最大的元素 \(N\) ,它把序列分成两部分。

考虑左边的一部分,它满足比之前所有数都大的数正好有 \(A-1\) 个,右边同理。

把每个比之前所有数都大的数和其右边比它小的连续一段的数分为一组,则左边有 \(A-1\) 组。

每一组中,最大的元素要放在最左边,其余的排列方式随意,所以是一个圆排列,即有代表元素的排列。

这提示我们考虑第一类斯特林数。

把左边和右边合起来考虑,总共 \(N-1\) 个元素,分成 \(A+B-2\) 个圆排列,也就是 \(\mathbf{S}_{N-1}^{A+B-2}\) 。

但是这些圆排列中,需要选取 \(A-1\) 个放在左边一部分,右边的放剩下的,也就是 \(\mathbf{C}_{A+B-2}^{A-1}\) 。

注意到确定了一部分放置哪些圆排列后,这一部分的圆排列顺序就确定了。

所以答案就是 \(\mathbf{S}_{N-1}^{A+B-2}\mathbf{C}_{A+B-2}^{A-1}\) 。

因为数据范围不大,暴力预处理第一类斯特林数和组合数即可。

 // 第一类斯特林数 (Stirling Number of the First Type)
// 将 n 个有标号元素 分为 m 个 圆排列 (无序) 的方案数 记作 S(n,m)
// 圆排列 : 轮换相同的视作相同的排列。
// 圆排列的实际意义 : 有代表元素的排列 , 例如代表元素为最大元素
// S(n,m) = S(n-1,m-1) + (n-1)*S(n-1,m)
// 考虑第 n 个元素 , 单独成一个排列 , 或者在前 n-1 个元素中的任意一个的左侧插入
// 边界 : S(0,0)=1 , S(n,0)=0 #include <cstdio> typedef long long LL;
const int mod = ; int S[][], C[][]; void Init() {
S[][] = ;
for (int i = ; i <= ; ++i) {
for (int j = ; j <= i && j <= ; ++j) {
S[i][j] = (S[i - ][j - ] + (LL)(i - ) * S[i - ][j]) % mod;
}
} C[][] = ;
for (int i = ; i <= ; ++i) {
C[i][] = ;
for (int j = ; j <= i && j <= ; ++j)
C[i][j] = (C[i - ][j - ] + C[i - ][j]) % mod;
}
} int main() {
Init();
int T;
scanf("%d", &T);
while (T--) {
int n, A, B;
scanf("%d%d%d", &n, &A, &B);
printf("%lld\n", (LL)S[n - ][A + B - ] * C[A + B - ][A - ] % mod);
}
return ;
}

洛谷 P4609: [FJOI2016] 建筑师的更多相关文章

  1. 洛谷P4609 [FJOI2016]建筑师 【第一类斯特林数】

    题目链接 洛谷P4609 题解 感性理解一下: 一神带\(n\)坑 所以我们只需将除了\(n\)外的\(n - 1\)个元素分成\(A + B - 2\)个集合,每个集合选出最大的在一端,剩余进行排列 ...

  2. [洛谷P4609] [FJOI2016]建筑师

    洛谷题目链接:[FJOI2016]建筑师 题目描述 小 Z 是一个很有名的建筑师,有一天他接到了一个很奇怪的任务:在数轴上建 \(n\) 个建筑,每个建筑的高度是 \(1\) 到 \(n\) 之间的一 ...

  3. 洛谷P4609 [FJOI2016]建筑师(第一类斯特林数+组合数)

    题面 洛谷 题解 (图片来源于网络,侵删) 以最高的柱子\(n\)为分界线,我们将左边的一个柱子和它右边的省略号看作一个圆排列,右边的一个柱子和它左边的省略号看作一个圆排列,于是,除了中间的最高的柱子 ...

  4. [洛谷4609] [FJOI2016]建筑师

    题目描述 LOJ题面:https://loj.ac/problem/2173. 洛谷题面:https://www.luogu.org/problemnew/show/P4609. Solution [ ...

  5. Luogu P4609 [FJOI2016]建筑师&&CF 960G Bandit Blues

    考虑转化题意,我们发现其实就是找一个长度为\(n\)的全排列,使得这个排列有\(A\)个前缀最大值,\(B\)个后缀最大值,求方案数 我们考虑把最大值拎出来单独考虑,同时定义一些数的顺序排列为单调块( ...

  6. 洛谷P4608 [FJOI2016]所有公共子序列问题 【序列自动机 + dp + 高精】

    题目链接 洛谷P4608 题解 建个序列自动机后 第一问暴搜 第二问dp + 高精 设\(f[i][j]\)为两个序列自动机分别走到\(i\)和\(j\)节点的方案数,答案就是\(f[0][0]\) ...

  7. 洛谷P4587 [FJOI2016]神秘数(主席树)

    题面 洛谷 题解 考虑暴力,对于询问中的一段区间\([l,r]\),我们先将其中的数升序排序,假设当前可以表示出\([1,k]\)目前处理\(a_i\),假如\(a_i>k+1\),则答案就是\ ...

  8. P4609 [FJOI2016]建筑师

    思路 裸的第一类斯特林数,思路和CF960G相同 预处理组合数和第一类斯特林数回答即可 代码 #include <cstdio> #include <cstring> #inc ...

  9. P4609 [FJOI2016]建筑师(第一类斯特林数)

    传送门 没想到连黑题都会有双倍经验的 其实这题本质上是和CF960G Bandit Blues一样的,不过那里是要用分治FFT预处理第一类斯特林数,这里直接打表预处理第一类斯特林数就可以了 //min ...

随机推荐

  1. 【Alpha】第三次Scrum meeting

    今日任务一览: 导航栏诞生 前期准备的Latex文本将撰写完毕 生成燃尽图的问题已经解决 姓名 今日完成任务 所耗时间 刘乾 用Github成功生成了燃尽图(真是不容易啊...),与架构师继续每日面基 ...

  2. PAT 甲级 1105 Spiral Matrix

    https://pintia.cn/problem-sets/994805342720868352/problems/994805363117768704 This time your job is ...

  3. 微信小程序初窥-环境搭建

    关于微信小程序的背景知识,在此不做阐述,可以自行搜索了解.本文将介绍微信小程序的账号的注册,IDE的下载,创建一个实例小程序. 1.注册小程序 前去链接:https://mp.weixin.qq.co ...

  4. Delphi中快速修改变量名称

    鼠标左键选择需要修改的范围,左侧会出现一个同步编辑模式(Sync Edit Mode),快捷键:CTRL+SHIFT+J,它可以让我们清楚地编写或改写多个同一参数.

  5. 清华集训2015-Day 1

    玛里苟斯 一个大小为 \(n\) 的可重集合 \(a\) ,求 \(\mathbb E[x^k]\) ,其中 \(x\) 为 \(a\) 的一个子集的异或和. \(n\le 10^5,1\le k\l ...

  6. 数位DP复习小结

    转载请注明原文地址http://www.cnblogs.com/LadyLex/p/8490222.html 之前学数位dp的时候底子没打扎实 虚的要死 这次正好有时间……刷了刷之前没做的题目 感觉自 ...

  7. 浅谈范德蒙德(Vandermonde)方阵的逆矩阵的求法以及快速傅里叶变换(FFT)中IDFT的原理

    浅谈范德蒙德(Vandermonde)方阵的逆矩阵与拉格朗日(Lagrange)插值的关系以及快速傅里叶变换(FFT)中IDFT的原理 标签: 行列式 矩阵 线性代数 FFT 拉格朗日插值 只要稍微看 ...

  8. 洛谷P2542 [AHOI2005]航线规划(LCT,双连通分量,并查集)

    洛谷题目传送门 太弱了不会树剖,觉得LCT好写一些,就上LCT乱搞,当LCT维护双连通分量的练手题好了 正序删边是不好来维护连通性的,于是就像水管局长那样离线处理,逆序完成操作 显然,每个点可以代表一 ...

  9. 团队Git使用教程

    团队git使用教程(不要使用IDE自带版本控制功能) 角色分配:项目观察者.项目拥有者.项目开发人员 场景:项目拥有者创建项目 1. 在当前目录新建一个git代码库 git init "te ...

  10. git other-误删恢复等

    修改未push的最后一次commit 如在commit后发现漏添加的文件或者commit message需要修改,则可以依次执行: git add FILE_UN_STAGED # 将未提交的文件添加 ...