【vijos】1286 座位安排(状压dp)

https://vijos.org/p/1286

这题好神不会捉。。。

首先我们知道所有情况有C(n*m, k)种,这个好搞。但是两两不相邻这个有点难搞。。

原来是状压dp。。sigh。

设状态f[i][j][k]表示第i行放置的摆放状态是j放了k个人的方案,那么有

f[i][j][k]=sum{f[i-1][x][k-num[x]]},当j的人两两不冲突,且j和x的人两两不冲突,num[x]是x状态的人的数量

最后不冲突的数目是sum{f[n][j][k]},k是题目所给的,j是所有的状态

显然这是可以减小一维的,那么我们用两个数组来组成滚动数组即可。还有一个要注意的地方就是求C(n*m, k)这个要防爆精度(因为,即我们要边乘边除orz且C(80, 20)的数量用longlong不会爆

 


背景

快要期中考试了!老师需要hzy帮他排考试的座位。。。

描述

考场里的座位恰好有n行m列,并且恰好有n*m位考生在这个考场里面考试,也就是 说,所有的座位上都有考生。hzy根据学校记载,有k位考生可能作弊,因此hzy不能让他们之中的任何两个人做在相邻的座位上!所谓相邻的座位,即在同一 行相邻列或者在同一列的相邻行的座位。hzy准备这样安排座位,首先随机选择一种方案,如果这种方案是合法的,就用这种方案,否则重新选择。你的任务是计 算,他得到一个合法方案时,需要的期望选择次数。

格式

输入格式

输入文件为一行,仅包含三个整数n,m和k。

输出格式

如果不存在合法的方案,则输出文件seating.out中应该包含Impossible!,否则输出一个分数p/q,表示期望选择次数(即平均次数),这里p和q应该是互质的。

样例1

样例输入1[复制]

1 4 3

样例输出1[复制]

Impossible!

样例2

样例输入2[复制]

2 3 2

样例输出2[复制]

15/8

提示

1≤n≤80,1≤m≤80,1≤n*m≤80
0≤k≤20,并且k≤n*m

posted @   iwtwiioi  阅读(562)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示