【每日一题】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. 如果你对牛客博客有任何意见或建议:牛客博客意见反馈专贴
全部评论
我有一个疑问,F[n]为什么要递推呢,不用递推直接求组合公式不是也能O(n)求吗,用排列组合板子直接求ΣC(n,i)*A(n,i)
1 回复 分享
发布于 2020-12-16 09:37
https://blog.nowcoder.net/n/42f76ff11f7f4a109a30b3a6b5bc3921 写题解得的牛币比大佬少怎么办
1 回复 分享
发布于 2020-04-13 16:34
https://blog.nowcoder.net/n/36c4ea0db4704c09923e106d56b65793
1 回复 分享
发布于 2020-04-09 21:59
https://blog.nowcoder.net/n/be8d551aa783495eaf3034e88f9c2d82
1 回复 分享
发布于 2020-04-09 20:39
https://blog.nowcoder.net/n/355a61e5355b46c389482cfb123f3c55
点赞 回复 分享
发布于 2020-04-17 11:55
https://blog.nowcoder.net/n/a33fdfd413dd465f9d0976f62dea768a
点赞 回复 分享
发布于 2020-04-17 11:55
https://blog.nowcoder.net/n/08f75d1c3ef14fcda785dbe0d09071b6 感谢邓老师的讲解,这个题真是把我搞崩溃了,
点赞 回复 分享
发布于 2020-04-16 17:30
https://blog.nowcoder.net/n/fab903acfad2441abb2e040832b7c097 给这题跪了!
点赞 回复 分享
发布于 2020-04-16 12:14
这题也太难了
点赞 回复 分享
发布于 2020-04-11 19:13
https://blog.nowcoder.net/n/f5b2b28a73e1403c9f67423410457b08
点赞 回复 分享
发布于 2020-04-10 15:33
https://blog.nowcoder.net/n/3382bba1a7cc4388a4d73acdbc81efc2
点赞 回复 分享
发布于 2020-04-10 13:47
https://blog.nowcoder.net/n/fca5e68846694f3abec28f4f590536e4
点赞 回复 分享
发布于 2020-04-09 19:33
点赞 回复 分享
发布于 2020-04-09 19:21
咋还没有人写题解呢?
点赞 回复 分享
发布于 2020-04-09 19:00

相关推荐

axiom15:校友,我感觉你这个简历去华子暑期实习随便去了
点赞 评论 收藏
分享
行云流水1971:这份实习简历的优化建议: 结构清晰化:拆分 “校园经历”“实习经历” 板块(当前内容混杂),按 “实习→校园→技能” 逻辑排版,求职意向明确为具体岗位(如 “市场 / 运营实习生”)。 经历具象化:现有描述偏流程,需补充 “动作 + 数据”,比如校园活动 “负责宣传” 可加 “运营公众号发布 5 篇推文,阅读量超 2000+,带动 300 + 人参与”;实习内容补充 “协助完成 XX 任务,效率提升 X%”。 岗位匹配度:锚定目标岗位能力,比如申请运营岗,突出 “内容编辑、活动执行” 相关动作;申请市场岗,强化 “资源对接、数据统计” 细节。 信息精简:删减冗余表述(如重复的 “负责”),用短句分点,比如 “策划校园招聘会:联系 10 + 企业,组织 200 + 学生参与,到场率达 85%”。 技能落地:将 “Office、PS” 绑定经历,比如 “用 Excel 整理活动数据,输出 3 份分析表;用 PS 设计 2 张活动海报”,避免技能单独罗列。 优化后需强化 “经历 - 能力 - 岗位需求” 的关联,让实习 / 校园经历的价值更直观。 若需要进一步优化服务,私信
实习,投递多份简历没人回...
点赞 评论 收藏
分享
评论
4
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务