题目

  点这里看题目。

分析

  可以想到用 DP 解决。

  由于把空位放到状态里面太麻烦了,因此我们单独将 " 组 " 提出来进行 DP 。

  \(f(i,j)\):前\(i\)个人组成\(j\)个组的方案数。

  此时这个组是有顺序有编号的,并且按照编号相邻(由于在环上,\(j\) 组和 \(1\) 组也算相邻)。

  考虑三种转移:

  1.我们新建一组,并在原来的一个组后面插入新组:\(f(i+1,j+1)+=j*f(i,j)\);

  2.我们将新的人安排到新的组里面,可以放在组的两头:\(f(i+1,j)+=2j*f(i,j)\);

  3.我们用一个人将两个组合在一起,有\(j\)个组相邻:\(f(i+1,j-1)+=j*f(i,j)\);

  可以发现这样 DP 只需要保证中途状态不会超过\(G\)组即可。

  环上问题,我们可以先固定第一个人的位置,计算出方案数然后再乘上\(n\)。因此\(f(1,1)=1\)。

  现在考虑怎么再组与组之间插入空位组成结果。设现在分配\(g\)个组,第\(i\)个组后有\(x_i\)个空位,则可以得到:

\[\sum_{i=1}^g x_i=n-k\ |x_i\ge 1
\]

  这是一个可用插板法解决的问题,因此可以快速计算方案数。

  因此一般情况的答案为:

\[\sum_{i=1}^G f(k,i)\times C_{n-k-1}^{i-1}
\]

  但是如果\(n=k\),则组合数下标为\(-1\),不能算。这实际上是位置会被坐满,只有一个组的情况。当第\(k\)个人入座的时候,他只可能有一个位置可坐,因此方案数为\(n\times f(k-1,1)\)。

代码

#include <cstdio>

const int mod = 1e9 + 7;
const int MAXN = 2005; template<typename _T>
void read( _T &x )
{
x = 0;char s = getchar();int f = 1;
while( s > '9' || s < '0' ){if( s == '-' ) f = -1; s = getchar();}
while( s >= '0' && s <= '9' ){x = ( x << 3 ) + ( x << 1 ) + ( s - '0' ), s = getchar();}
x *= f;
} template<typename _T>
void write( _T x )
{
if( x < 0 ){ putchar( '-' ); x = ( ~ x ) + 1; }
if( 9 < x ){ write( x / 10 ); }
putchar( x % 10 + '0' );
} int f[MAXN][MAXN], C[MAXN][MAXN];
int N, K, G; void upt( int &x, const int v ) { x = ( x + v ) % mod; } void init()
{
C[0][0] = 1;
for( int i = 1 ; i <= N ; i ++ )
{
C[i][0] = C[i][i] = 1;
for( int j = 1 ; j < i ; j ++ ) C[i][j] = ( C[i - 1][j] + C[i - 1][j - 1] ) % mod;
}
} class Seatfriends
{
public:
int countseatnumb( const int n, const int k, const int g )
{
N = n, K = k, G = g;
init();
f[1][1] = 1;
for( int i = 1 ; i < K ; i ++ )
for( int j = 1 ; j <= G ; j ++ )
{
upt( f[i + 1][j], 2ll * j * f[i][j] % mod );
upt( f[i + 1][j + 1], 1ll * j * f[i][j] % mod );
if( j > 1 ) upt( f[i + 1][j - 1], 1ll * j * f[i][j] % mod );
}
int ans = 0;
if( N == K ) return 1ll * f[K - 1][1] * N % mod;
for( int i = 1 ; i <= G ; i ++ )
upt( ans, 1ll * f[K][i] * ( N == K ? 1 : C[N - K - 1][i - 1] ) % mod );
return 1ll * ans * N % mod;
}
};

[TopCoder]Seatfriends的更多相关文章

  1. TopCoder kawigiEdit插件配置

    kawigiEdit插件可以提高 TopCoder编译,提交效率,可以管理保存每次SRM的代码. kawigiEdit下载地址:http://code.google.com/p/kawigiedit/ ...

  2. 记第一次TopCoder, 练习SRM 583 div2 250

    今天第一次做topcoder,没有比赛,所以找的最新一期的SRM练习,做了第一道题. 题目大意是说 给一个数字字符串,任意交换两位,使数字变为最小,不能有前导0. 看到题目以后,先想到的找规律,发现要 ...

  3. TopCoder比赛总结表

    TopCoder                        250                              500                                 ...

  4. Topcoder几例C++字符串应用

    本文写于9月初,是利用Topcoder准备应聘时的机试环节临时补习的C++的一部分内容.签约之后,没有再进行练习,此文暂告一段落. 换句话说,就是本文太监了,一直做草稿看着别扭,删掉又觉得可惜,索性发 ...

  5. TopCoder

    在TopCoder下载好luncher,网址:https://www.topcoder.com/community/competitive%20programming/ 选择launch web ar ...

  6. TopCoder SRM 596 DIV 1 250

    body { font-family: Monospaced; font-size: 12pt } pre { font-family: Monospaced; font-size: 12pt } P ...

  7. 求拓扑排序的数量,例题 topcoder srm 654 div2 500

    周赛时遇到的一道比较有意思的题目: Problem Statement      There are N rooms in Maki's new house. The rooms are number ...

  8. TopCoder SRM 590

     第一次做TC,不太习惯,各种调试,只做了一题...... Problem Statement     Fox Ciel is going to play Gomoku with her friend ...

  9. Topcoder Arena插件配置和训练指南

    一. Arena插件配置 1. 下载Arena 指针:http://community.topcoder.com/tc?module=MyHome 左边Competitions->Algorit ...

随机推荐

  1. 点击劫持ClickJacking

    原文:https://beenle-xiaojie.github.io/2019/01/07/ClickJacking/ 引言 当我们的页面嵌入到一个iframe中时,安全测试提出一个于我而言很新鲜的 ...

  2. 点双连通分量F. Simple Cycles Edges

    F. Simple Cycles Edges time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  3. python基础:list与string互转

    数据清洗必备技能 https://www.cnblogs.com/yaner2018/p/11162630.html

  4. 循序渐进VUE+Element 前端应用开发(1)--- 开发环境的准备工作

    之前一直采用VS进行各种前端后端的开发,随着项目的需要,正逐步融合纯前端的开发模式,开始主要选型为Vue + Element 进行BS前端的开发,后续会进一步整合Vue + AntDesign的界面套 ...

  5. [PHP学习教程 - 网络]002.获取网页内容(URL Content)

    引言:获取网页内容是我们实现网页操作的基本之基本,今天这一讲,我们和大家讲一下基本请求网页内容的几种方法. 我们似乎每天都要做这样一件事情,打开一个浏览器,输入网址,回车,一个空白的页面顿时有了东西, ...

  6. 突发!HashiCorp禁止在中国使用企业版VAULT软件

    目录 前言 HashiCorp公司介绍 HashiCorp旗下的软件 Provision Secure Connect Run 总结 前言 昨天HashiCorp突然发布一则消息,禁止在中国使用Vau ...

  7. 最短路径——Dijkstar算法

    背景:本文是在小甲鱼数据结构教学视频中的代码的基础上,添加详细注释而完成的.该段代码并不完整,仅摘录了核心算法部分,结合自己的思考,谈谈理解. Dijkstar算法理解: Dijkstar算法的核心思 ...

  8. 前后端分离,如何在前端项目中动态插入后端API基地址?(in docker)

    开门见山,本文分享前后端分离,容器化前端项目时动态插入后端API基地址,这是一个很赞的实践,解决了前端项目容器化过程中受制后端调用的尴尬. 尴尬从何而来 常见的web前后端分离:前后端分开部署,前端项 ...

  9. 【项目】关于TeenCode第二代评测机的技术分析

    晚上睡不着觉,仔细研读了洛谷的第四代评测机技术分析后,突然发现自己写的TeenCode评测机竟然有这么多地方可以改进,这不得不让我诞生了实现第二代TeenCode评测机的想法.[第一代评测机挺可怜的, ...

  10. Rocket - tilelink - Monitor

    https://mp.weixin.qq.com/s/6e-G5RSQc7Xje7mQj8-Lag   简单介绍Monitor的实现.   ​​   1. 基本介绍   用于监控各个channel上的 ...