【每日一题】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

相关推荐

01-28 16:12
中南大学 Java
几年前还没有chatgpt的时候,刷题真的是很痛苦。刷不出来只能看题解,题解有几个问题:第一个是每次看的写题解的人都不一样,很难有一个统一的思路;第二个也是最重要的是,题解只提供了作者自己的思路,但是没有办法告诉你你的思路哪里错了。其实很少有错误的思路,我只是需要被引导到正确的思路上面去。所以传统题解学习起来非常困难,每次做不出来难受,找题解更难受。但是现在chatgpt能做很多!它可以这样帮助你 -1. 可以直接按照你喜欢的语言生成各种解法的题解和分析复杂度。2. 把题和你写的代码都发给它,它可以告诉你 你的思路到底哪里有问题。有时候我发现我和题解非常接近,只是有一点点🤏想错了。只要改这一点点就是最优解。信心倍增。3. 如果遇到不懂的题解可以一行一行询问为什么要这样写,chatgpt不会嫌你烦。有时候我觉得自己的range写错了,其实那样写也没错,只是chat老师的题解有一点优化,这个它都会讲清楚。4. 它可以帮你找可以用同类型解法来做的题。然后它可以保持解法思路不变,用一个思路爽刷一个类型的题。如果题目之间思路又有变化,它会告诉你只有哪里变了,其他的地方还是老思路。5. 它也可以直接帮你总结模板,易错点。经过chat老师的指导,我最大的改变是敢刷题了。之前刷题需要先找某一个人写的算法题repo,然后跟着某一个人他的思路刷他给的几个题。如果想写别的题,套用思路失败了,没有他的题解,也不知道到底哪里错了;看别人的题解,思路又乱了。这个问题在二分查找和dp类型的题里面特别常见。但是现在有chat老师,他会针对我的代码告诉我我哪里想错了,应该怎么做;还按照我写代码的习惯帮我总结了一套属于我的刷题模板。每天写题全是正反馈!
明天不下雨了:那我建议可以用 chatgpt atlas 或者 dia 去刷,也可以用 chrome 加个 ai 插件去刷 左边刷题右边 chat 效果很好
AI时代的工作 VS 传...
点赞 评论 收藏
分享
评论
4
1
分享

创作者周榜

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