思路

首先,对于计数题,不是 \(\text{dp}\) 就是排列组合,这题多思考一会儿就发现单纯 \(\text{dp}\) 和排列组合是做不出来的。然后激动人心地发现,这题是 \(\text{dp} \ +\) 排列组合。

现在来思考怎么做,我们可以发现如果不考虑区间两两之间的空座位,当成选为一个个集合的话是非常好 \(\text{dp}\) 的,但对于空格的处理无法使用 \(\text{dp}\) 处理的,同时对于两两不相邻的区间,必须插入至少 \(1\) 个空格以消除 \(\text{dp}\) 没考虑空格的影响。

现在问题就转换为有 \(i\) 个不同物品,共 \(n - k\) 块隔板,要在每两个物品间插入至少一个相同隔板,问有多少种方案数,即盒子与球,计数为 \(C_{n - k - 1}^{i - 1}\) ,再乘上 \(dp_{k, i}\) 并将所有 \(i\) 加起来。

细节

对于 \(\text{dp}\) ,是一个插入 \(\text{dp}\) ,使用刷表更容易,定义 \(dp_{i, j}\) 表示选了前 \(i\) 个人,共 \(j\) 个区间的方案数,然后推转移,若刷表即如下:

\[dp_{i, j} \times j \to dp_{i + 1, j + 1} , dp_{i + 1, j - 1}
\]
\[dp_{i, j} \times 2j \to dp_{i, j}
\]

对于 \(dp_{i, j} \times j\) 即将当前数插入到/合并已有的 \(j\) 个区间。对于 \(dp_{i, j} \times 2j\) 即加入到已有的 \(j\) 个区间的两侧。


对于计数,盒子与球的公式已给,现在就要将所有 \(dp_{m, i}\) 加起来,答案就是

\[\sum_{i = 1}^{k}{dp_{m, i} \times C_{n - m - 1}^{i - 1}}
\]

此外,对于 \(n = m\) 的情况,上述式子就失效了,因为 \(n - m - 1 < 0\) ,但因为最后只剩一个区间,所以可以取 \(dp_{m - 1, 1}\) 为答案,\(m - 1\) 的原因即在最后连成环之前必须是只剩一个区间而最后 \(dp_{m, 1}\) 会从不合法的 \(dp_{m - 1, 2}\) 转移。

Code

/*
address:https://vjudge.net/problem/TopCoder-12909
AC 2024/12/27 21:30
*/
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 2005;
const int mod = 1e9 + 7;
int n, m, t;
LL dp[N][N];
LL C[N][N];
inline void trans(LL& x, LL y) { x = (x + y) % mod; }
inline LL power(LL a, LL k) {
LL ret = 1;
while (k > 0) {
if (k & 1) ret = ret * a % mod;
a = a * a % mod;
k >>= 1;
}
return ret;
}
inline LL solve() {
dp[1][1] = n;
for (int i = 1;i < m;i++)
for (int j = 1;j <= i && j <= t;j++) {
if (j < t) trans(dp[i + 1][j + 1], dp[i][j] * j % mod);
if (j > 1) trans(dp[i + 1][j - 1], dp[i][j] * j % mod);
trans(dp[i + 1][j], dp[i][j] * j % mod * 2 % mod);
}
if (n == m) return dp[m - 1][1];
LL ret = 0;
for (int i = 1;i <= t;i++)
trans(ret, dp[m][i] * C[n - m - 1][i - 1] % mod);
return ret;
}
int main() {
scanf("%d%d%d", &n, &m, &t);
C[0][0] = 1;
for (int i = 1;i <= n;i++) {
C[i][0] = 1;
for (int j = 1;j <= i;j++) C[i][j] = (C[i - 1][j - 1] + C[i - 1][j]) % mod;
}
printf("%lld", solve());
return 0;
}

「TC SRM625 D1L3」Seatfriends的更多相关文章

  1. 对于前端,「微信小程序」其实不美好

    微信小程序开放公测了,9月底我曾经写过一篇 「微信小程序」来了,其中最后一句:"谢天谢地,我居然还是个前端". 这种火爆的新事物总是令人激动,感谢这个时代. 但是,当我真作为开发者 ...

  2. macOS安装「oh my zsh」

    目前常用的 Linux 系统和 OS X 系统的默认 Shell 都是 bash,但是真正强大的 Shell 是深藏不露的 zsh, 这货绝对是马车中的跑车,跑车中的飞行车,史称『终极 Shell』, ...

  3. 报名|「OneAPM x DaoCloud」技术公开课:Docker性能监控!

    如今,越来越多的公司开始 Docker 了,「三分之二的公司在尝试了 Docker 后最终使用了它」,也就是说 Docker 的转化率达到了 67%,同时转化时长也控制在 60 天内. 既然 Dock ...

  4. 企业运营对 DevOps 的「傲慢与偏见」

    摘要:出于各种原因,并非所有人都信任 DevOps .有些人觉得 DevOps 只不过给开发者改善产品提供了一个途径而已,还有的人觉得 DevOps 是一堆悦耳的空头支票,甚至有人认为 DevOps ...

  5. 「前端开发者」如何把握住「微信小程序」这波红利?

    由于前两周一直在老家处理重要事情,虽然朋友圈被「微信小程序」刷爆了,但并没有时间深入了解. 昨天回广州之后,第一件事情就是把「微信小程序」相关的文章.开发文档.设计规范全部看了一遍,基本上明白了「微信 ...

  6. 「花田对」CSDN程序员专场——谁来拯救技术宅!_豆瓣

    「花田对」CSDN程序员专场--谁来拯救技术宅!_豆瓣 「花田对」CSDN程序员专场--谁来拯救技术宅!

  7. Objective-C 实用关键字详解1「面试、工作」看我就 🐒 了 ^_^.

    在写项目 或 阅读别人的代码(一些优秀的源码)中,总能发现一些常见的关键字,随着编程经验的积累大部分还是知道是什么意思 的. 相信很多开发者跟我当初一样,只是基本的常用关键字定义属性会使用,但在关键字 ...

  8. LOJ6003 - 「网络流 24 题」魔术球

    原题链接 Description 假设有根柱子,现要按下述规则在这根柱子中依次放入编号为的球. 每次只能在某根柱子的最上面放球. 在同一根柱子中,任何2个相邻球的编号之和为完全平方数. 试设计一个算法 ...

  9. LOJ6002 - 「网络流 24 题」最小路径覆盖

    原题链接 Description 求一个DAG的最小路径覆盖,并输出一种方案. Solution 模板题啦~ Code //「网络流 24 题」最小路径覆盖 #include <cstdio&g ...

  10. LOJ6001 - 「网络流 24 题」太空飞行计划

    原题链接 Description 有个实验和个仪器,做实验有报酬买仪器有花费.每个实验都需要一些仪器,求最大净收益(实验报酬仪器花费),并输出一组方案. Solution 实验向所需仪器连边,实验的点 ...

随机推荐

  1. 超级干货:Air780E之RS485通信篇,你学会了吗?

    ​ 今天,我们来学习低功耗4G模组Air780E的RS485通信,同学们,你学习了吗? 一.RS485简介  物联网(IoT)在工业场景中的应用越来越广泛,而RS485是一种常见的通信协议,广泛应用于 ...

  2. P5987 [PA2019] Terytoria / 2023NOIP A层联测13 T3 全球覆盖

    P5987 [PA2019] Terytoria / 2023NOIP A层联测13 T3 全球覆盖 题面及数据范围 对于一个点对,可以降维为线段,转化为 1 维的问题. 如图: 我们可以在横着的方向 ...

  3. 孤立森林(IForest)代码实现及与PyOD对比

    孤立森林(Isolation Forest)是经典的异常检测算法(论文网址).本文用python对其进行实现,以及与常用的异常检测包PyOD进行效果对比. 简单来说,孤立森林(IForest)中包含若 ...

  4. YOLOv8-PyQT5可视化界面

    使用PyQT5实现YOLOv8图形化界面 准备工作: 1.首先在YOLOv8环境中安装pyqt5 pip install pyqt5 pip install pyqt5-tools 然后再你的anac ...

  5. 理解Java BlockingQueue

    数据结构与算法是天生一对. BlockingQueue叫做阻塞队列,在Java线程池相关的实现中有广泛的使用. BlockingQueue实现的功能如下: 当队列为空时,往队列中读数据将被阻塞. 当队 ...

  6. docker构建supervisor镜像

    1 介绍 记录使用docker 构建包含 supervior 的镜像, supervisor: 是一个管理和监控进程的程序,可以方便的通过配置文件来管理我们的任务脚本 将supervisor构建到系统 ...

  7. ZCMU-1156

    思路: 要改变的是一个范围的情况,所以正常情况下会超时. 查阅后知道应该用一个叫做树状数组的结构. 查阅和树状数组的后续情况 这个也不错 注意: 我没怎么看懂,可能没太仔细看. 树状数组当中存在的是前 ...

  8. CSS 样式百分比

    1.宽高百分比 元素宽度/高度百分比是基于父级元素的width/height,不包含padding,border 注意:高度百分比一定要求父元素有设置height属性,只设置 min-height 虽 ...

  9. Python 潮流周刊#80:Django 项目性能调优(摘要)

    本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...

  10. 04C++顺序结构(3)

    一.设置域宽setw() 教学视频1 输出的内容所占的总宽度成为域宽,有些高级语言中称为场宽.使用setw()前,必须包含头文件iomanip,即#include.头文件iomanip,用来声明一些& ...