题意简单明确(

很容易知道最高的位置一定是左边能看到最高的和右边能看到最高的。于是我们考虑一个 dp:

设 \(dp[n][A][B]\) 表示长度为 \(n\) 的排列,左边有 \(A\) 个 balabala,右边有 \(B\) 个 balabala。

我们考虑每次令整个排列的元素全部加一,然后插入一个 \(1\)。

很明显,如果 \(1\) 插在最左边,会令 \(A+1\),如果插在最右边会令 \(B+1\),否则都不变。

于是得到了递推方程:

\[dp[n][A][B]=dp[n-1][A-1][B]+dp[n-1][A][B-1]+(n-2) \times dp[n-1][A][B]
\]

这样会得到 20pts 的好成绩。吸口氧不知道能不能跑快点儿。

观察 dp 的递推式,发现其存在组合意义:从 \((1,1,1)\) 到 \((n,A,B)\),令 \(n+1\) 会使 \(prod\) 乘上一个 \(n-1\) 。问所有路径的权值之和。

所以相当于从 \((1,n]\) 中选 \(A+B-2\) 个位置,其中 \(A-1\) 个位置为 \(0\),\(B-1\) 个位置为 \(1\),剩下的为下标减去 \(2\)。

于是问题变成了从 \([0,n-2]\) 中选择 \(A+B-2\) 个数删掉,所有方案剩下数之积之和。

从 \(n\) 个数中选择 \(m\) 个数删掉,似乎是经典的背包问题。

设 \(f[n][m]\) 为 \([0,n-2]\) 中删掉 \(m\) 个数的积之和。

然后你发现 \(f[1][1]\) 的定义出现了问题,于是重新设,设为 \([0,n-1]\),最后把 \(f[n][A+B-2]\) 改成 \(f[n-1][A+B-2]\) 就行。

这里的递推式为 \(f[n][m]=f[n-1][m] \times (n-1)+f[n-1][m-1]\)。

然后我们需要从 \(A+B-2\) 中选择 \(A-1\) 个位置令其为 \(1\),剩下的位置为 \(0\)。

所以答案就是 \(f[n-1][A+B-2] \times \binom {A+B-2} {A-1}\)。

写完题解后翻了一圈题解区,咋全是斯特林数,然后发现自己的 \(f\) 就是斯特林数/qd

#include<cstdio>
#include<cctype>
typedef unsigned ui;
const ui M=2e5+5,mod=1e9+7;
ui T,n[M],A[M],B[M],C[205][205],f[50005][205];
inline ui Add(const ui&a,const ui&b){
return a+b>=mod?a+b-mod:a+b;
}
inline ui read(){
ui n(0);char s;while(!isdigit(s=getchar()));
while(n=n*10+(s&15),isdigit(s=getchar()));return n;
}
inline void write(ui n){
static char s[10];ui top(0);
while(s[++top]=n%10^48,n/=10);
while(putchar(s[top]),--top);
}
signed main(){
ui i,j,mx(0);T=read();f[0][0]=C[0][0]=1;
for(i=1;i<=T;++i)n[i]=read(),A[i]=read(),B[i]=read(),n[i]>mx&&(mx=n[i]);
for(i=1;i<=mx;++i)for(j=1;j<=i&&j<=200;++j)f[i][j]=(f[i-1][j]*(i-1ull)+f[i-1][j-1])%mod;
for(i=1;i<=200;++i)for(C[i][0]=1,j=1;j<=200;++j)C[i][j]=Add(C[i-1][j],C[i-1][j-1]);
for(i=1;i<=T;++i)write(1ull*f[n[i]-1][A[i]+B[i]-2]*C[A[i]+B[i]-2][A[i]-1]%mod),putchar(10);
}

LGP4609题解的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

随机推荐

  1. HTML-iframe标签

    碎碎:这两天在实践中,用到了 iframe,之前对其不甚了解,了解之中遇到好多奇葩问题,今天记录下这两天遇到的相关的内容. 嵌入的 iframe 页面的边框 嵌入的 iframe 页面的背景 嵌入的 ...

  2. opencv笔记--Active contours

    Active Contours 也称作 Snake,通过定义封闭区域曲线的能量函数,并使其最小化得到最终曲线. Active Contours 被用作物体边界精确定位上,opencv 给出了一个实现, ...

  3. python生成器对象&常见内置函数

    内容概要 异常捕获(补充) for循环本质 生成器 yield 和 return优缺点 笔试题 常用内置函数 内容详细 一.异常捕获补充 try: print(name) except NameErr ...

  4. Solution -「LOCAL」舟游

    \(\mathcal{Description}\)   \(n\) 中卡牌,每种三张.对于一次 \(m\) 连抽,前 \(m-1\) 次抽到第 \(i\) 种的概率是 \(p_i\),第 \(m\) ...

  5. suse 12 脚本部署docker(二进制文件)

    suse-linux:~ # cat /etc/issue Welcome to SUSE Linux Enterprise Server 12 SP3 (x86_64) - Kernel \r (\ ...

  6. Spring Boot对Spring Data JPA的支持

    前两篇介绍了Spring Data JPA的基本使用,本篇介绍Spring Boot 对JPA的支持.如下: 1)导入坐标 2)注解配置 其他配置同Spring Data JPA应用之常规CRUD操作 ...

  7. netty系列之:Bootstrap,ServerBootstrap和netty中的实现

    目录 简介 Bootstrap和ServerBootstrap的联系 AbstractBootstrap Bootstrap和ServerBootstrap 总结 简介 虽然netty很强大,但是使用 ...

  8. 利用信号量semaphore实现两个进程读写同步 Linux C

    这篇帖子主要是记录一下自己使用信号量遇到的坑. 首先是需求:创建两个进程A,B.A往buffer中写,B读.两个进程利用命名管道进行通信,并实现读写同步.即A写完后通知B读,B读完后通知A写. 如果A ...

  9. Vulhub-漏洞环境的搭建(详细版)

    安装Vulhub需要的基础环境 更新现有的软件 复制代码 1 2 sudo apt-get update sudo apt-get upgrade 安装Docker 复制代码 1 2 3 4 5 6 ...

  10. 可视化BI软件为企业提升数据分析效率

    ​可视化BI软件经过几十年的不断发展,已成为大型企业进行商业决策不可缺少的工具.在BI软件问世之前,由于做数据分析可视化的时间较长.人力成本较高,企业一直处于忽视的状态.可视化BI软件的出现极大地提高 ...