[SRM625 Div1 Hard] Seatfriends
Solution
一开始拿到这一题Sb了,把空放到dp中一起考虑了,这样计数就变得很麻烦。
其实我们可以把空位拿出来,假设它是存在的,最后再放回去。
那么就可以钦定某个人放到第一个,因为这是环排列,所以最后乘以n就可以了。
设\(Dp[i][j]\)表示来了\(i\)个人,分成\(j\)个联通块的方案数。
那么新来的人有三种选择,加入一个联通块,独立成为一个联通块,合并两个联通块:
Dp[i + 1][j - 1] += dp[i][j] * j\\
Dp[i + 1][j] += dp[i][j] * 2j
\]
最后利用隔板法:$$ ans = n\sum_{i = 1}^{G} dp[m][i] * {n - k - 1 \choose i - 1}$$
一般环排列有空的计数,可以把空位全部抽出来计数,并且在计数过程中假定空存在,最后再用隔板法插入。
如果所求排列是环排列,那就钦定一种选法然后乘上环的大小即可。
Code
#include<bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for(int i = (a), i##_end_ = (b); i <= i##_end_; ++i)
#define drep(i, a, b) for(int i = (a), i##_end_ = (b); i >= i##_end_; --i)
#define clar(a, b) memset((a), (b), sizeof(a))
#define debug(...) fprintf(stderr, __VA_ARGS__)
typedef long long LL;
typedef long double LD;
const int Maxn = 4009, Mod = 1e9 + 7;
class Seatfriends {
private:
int dp[Maxn][Maxn];
int invFac[Maxn], fac[Maxn];
public:
int fpm(int base, int tims) {
int r = 1;
while (tims) {
if (tims & 1) r = r * 1ll * base % Mod;
base = base * 1ll * base % Mod;
tims >>= 1;
}
return r;
}
int C(int n, int m) {
if (m > n) return 0;
return fac[n] *1ll * invFac[m] % Mod * invFac[n - m] % Mod;
}
void init(int n) {
fac[0] = 1;
rep (i, 1, n) fac[i] = 1ll * fac[i - 1] * i % Mod;
invFac[n] = fpm(fac[n], Mod - 2);
drep (i, n - 1, 0) invFac[i] = invFac[i + 1] * (i + 1ll) % Mod;
}
int countseatnumb(int n, int k, int g) {
init(n + k); clar(dp, 0);
dp[1][1] = 1;
rep (i, 1, k)
rep (j, 1, g)
if (dp[i][j]) {
(dp[i + 1][j + 1] += 1ll * dp[i][j] * j % Mod) %= Mod;
(dp[i + 1][j] += 2ll * j % Mod * dp[i][j] % Mod) %= Mod;
if (j > 1) (dp[i + 1][j - 1] += 1ll * dp[i][j] * j % Mod) %= Mod;
}
LL ans = 0;
if (n == k) return (g >= 1) * dp[k - 1][1] * 1ll * n % Mod;
rep (i, 1, g) ans = (ans + 1ll * dp[k][i] * C(n - k - 1, i - 1) % Mod) % Mod;
return ans * 1ll * n % Mod;
}
};
[SRM625 Div1 Hard] Seatfriends的更多相关文章
- CF#345 (Div1)
论蒟蒻如何被cf虐 以下是身败名裂后的题解菌=========== Div1 A.Watchmen 有n个点,每个点有一个坐标.求曼哈顿距离=欧几里得距离的点对数量. 只需要统计x或y一样的点对数量. ...
- 图论 SRM 674 Div1 VampireTree 250
Problem Statement You are a genealogist specializing in family trees of vampires. Vampire famil ...
- jq对象转为dom对象:$(".div1")[0] dom对象转为jq对象:$(dom对象)
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...
- 第一次div1做出3道题
第一次div1做出3道题! 再接再厉! 哈利路亚!
- 第一次进div1了
第一次进div1~好激动啊! 上帝依旧那么眷顾我!
- TopCoder 649 div1 & div2
最近一场TC,做得是在是烂,不过最后challenge阶段用一个随机数据cha了一个明显错误的代码,最后免于暴跌rating,还涨了一点.TC题目质量还是很高的,非常锻炼思维,拓展做题的视野,老老实实 ...
- SRM DIV1 500pt DP
SRM 501 DIV1 500pt SRM 502 DIV1 500pt SRM 508 DIV1 500pt SRM 509 DIV1 500pt SRM 511 DIV1 500pt SRM 5 ...
- codeforces #305 div1 done
总算搞定了这一场比赛的题目,感觉收获蛮大 其中A,B,C都能通过自己的思考解决掉 D题思路好神,E题仔细想想也能想出来 以后坚持每两天或者一天做一场CF的div1的全套题目 除非有实在无法做出来的题目 ...
- [Codeforces Round #254 div1] C.DZY Loves Colors 【线段树】
题目链接:CF Round #254 div1 C 题目分析 这道题目是要实现区间赋值的操作,同时还要根据区间中原先的值修改区间上的属性权值. 如果直接使用普通的线段树区间赋值的方法,当一个节点表示的 ...
随机推荐
- java中可以通过调用ping命令来判断网络是否连接正常
原文:http://www.open-open.com/code/view/1446382328960 import java.io.BufferedReader; import java.io.IO ...
- 【转载】Unix设计哲学 & 回车换行八卦 & EOF八卦 & UNIX目录结构八卦
昨天看了这篇文章 <关于Unix哲学> 首先用了两个例子,用风扇吹出空肥皂盒 和 太空铅笔,来说明简单设计也能派上作用吧. Unix哲学,Wikipedia上列出了好几个版本,不同的人有不 ...
- Office Adobe Acrobat把PDF转换为Word时候提示不支持的Type2字体怎么办
如下图所示,在使用Adobe Acrobat Pro9将PDF转换为Word的时候出现下面的错误 很简单,不要用Adobe Acrobat Pro9了,用Adobe Acrobat Pro X,还 ...
- vue 自定义报警组件
1.自定义报警组件 Alarm.vue <!-- 报警 组件 --> <template> <div class="alarm"> <!- ...
- vue Iframe
1.Iframe.vue <!-- Iframe --> <template> <div> <!-- 标题栏 --> <mt-header tit ...
- 责任链模式的具体应用 ServiceStack.Redis订阅发布服务的调用
责任链模式的具体应用 1.业务场景 生产车间中使用的条码扫描,往往一把扫描枪需要扫描不同的条码来处理不同的业务逻辑,比如,扫描投入料工位条码.扫描投入料条码.扫描产出工装条码等,每种类型的条码位数 ...
- ZOJ 3228 Searching the String (AC自己主动机)
题目链接:Searching the String 解析:给一个长串.给n个不同种类的短串.问分别在能重叠下或者不能重叠下短串在长串中出现的次数. 能重叠的已经是最简单的AC自己主动机模板题了. 不能 ...
- 利用shuf对数据记录进行随机采样
最近在用SVM为分类器做实验,但是发现数据量太大(2000k条记录)但是训练时间过长...让我足足等了1天的啊!有人指导说可以先进行一下随机采样,再训练,这样对训练结果不会有太大影响(这个待考证).所 ...
- SQL Server 存储过程具体解释
SQL Server 存储过程具体解释 存储过程的优缺点 ◆长处: 运行速度更快. 存储过程仅仅在创造时进行编译,而一般SQL语句每运行一次就编译一次,所以使用存储过程运行速度更快. 存储过程用于处理 ...
- linux document and directory find
http://suchalin.blog.163.com/blog/static/55304677201062924959497/ Linux 查看文件夹大小及文件数量命令 2010-07-29 14 ...