竞赛讨论区 > 【每日一题】4月10日题目精讲 组合、容斥
头像
王清楚
编辑于 2020-04-10 10:56
+ 关注

【每日一题】4月10日题目精讲 组合、容斥

题号 NC13229
名称 二分图染色
来源 美团2017年CodeM大赛-初赛A轮
戳我进入往期每日一题汇总贴~

注:如果你在题库做题时遇到了喜欢的题目,欢迎推荐给邓老师~ 点击查看详情

今天这个题看来是偏难了……

这个题的第一个难点也是它设计得最巧妙的一个点,在于要把找个二分完全图的染色问题向二维棋盘格子上的行列覆盖转化。(如果你学过二分图匹配并做过一些相关的练习,其实你是应该能想到的——二分图匹配相关的问题往往是:棋盘格子上的行列覆盖转化成二分完全图匹配,1*2的小骨牌覆盖转化为棋盘格子黑白染色之后的二分图匹配,这个题只是反过来转换了。)

原题是左右两边各有n个点的完全二分图每条边选一个颜色来染,我们把问题转化为在n*n的棋盘上放棋子(棋盘的行和列分别对应二分图左边的点 和右边的点,棋子对应的是边);原题是边染成三种颜色而且实际上绿色没啥用,我们可以认为绿色是没染色的,这样子的话要转换到棋盘上其实就是选一些格子放红色或者蓝色的棋子 ;原题要求任意两条红边不共享端点、同时任意两条蓝边也不共享端点,转化之后就是任意一行一列不能有两个颜色相同的棋子。

总结一下就是说:题目变成了,在n*n的棋盘上选择若干个格子放置红色或者蓝色的棋子,任意一行或者任意一列没有两个相同颜色的棋子。

先考虑只有一种颜色的情况,如果我们用来表示棋盘大小为n*n时候的答案,那显然有种方案(n行里面选若干行,每一行再对应选若干列,选列的时候就是排列而不是组合了)

两种颜色的话,可以在中减去两种棋子有至少一个在一个格子的情况。这个是需要容斥的,因为 表示的并不是至少有一个格子里有两个棋子的方法数,因为当有两个即两个以上的格子里有两个棋子的时候,对于每一个格子X有两个棋子的情况,在里面都贡献了一个1,这个时候是X和另外的若干个格子里有两个棋子,而当的另一个1即表示格子Y里面有两个棋子的时候里面也是有之前那个X的,于是就算重复了。所以需要使用容斥原理(大家一定要去手推一下!),最后算出来是

有取模操作,所以都可以提前用乘法逆元求好,而F(n)也要提前求,并且得的求……也就是说上面那个组合公式不能用。

我们来考虑一下F(n)能不能递推。即从F[n-1]算F[n] 。

从n-1到n的时候,格子增加了一行一列一共2n-1个,如果我们在这些格子里面只放一个棋子进去,就有2n-1个方案,加上一个都不放的1种,就是2n种。但是这样的方法里面会有矛盾出现,即我当前放的这一个和它所在行(如果是放在最后一列的话)、所在列(放在最后一行)的棋子矛盾,方案数是,如图:
图片说明

还有放两个的情况:即在最后一行放一个,在最后一列也放一个,方案数为:,如图:
图片说明

然后就可以线性的算出F[n]再线性的去算容斥了。

看完邓老师的题解,记得做题提高呀~
欢迎各位大佬来做题写题解,也欢迎大家踊跃在当日讨论贴中提问!

活动奖励:

在牛客博客中写出题解,并回复地址
审核通过可获得(依据题目难度和题解的内容而定)

本道题目4月17日中午12:00之前写的题解有获得牛币资格~

.牛币兑换中心

牛客博客开通方式

  1. 如何开通牛客博客:https://www.nowcoder.com/discuss/202952
  2. 如何使用博客搬家功能:进入博客--->设置--->底部博客搬家
  3. 如果你对牛客博客有任何意见或建议:牛客博客意见反馈专贴

全部评论

(14) 回帖
加载中...
话题 回帖

本文相关内容

等你来战

查看全部

热门推荐