[CQOI2011] 放棋子

前言

偶遇重庆题目, 害怕
上午 + 大半个下午浪费了太多时间, 不过好歹也是搞得比较明白, 下午冲一下进度

思路

听过了捏, 忘了捏, 以后还是听了直接补好一点

转化题意

n×m 的矩阵中填上颜色, 其中颜色 i 要填 ci 个, 要求同一行和同一列不能有异色块, 求有多少种方案满足要求

先考虑朴素计算, 我们可以令 fi,j,p 表示使用了 ij 列, 已经填完了 p 种颜色的方案数
考虑转移

fi,j,pl=0i1r=0j1fl,r,p1用 ci 个颜色占领 il 行 jr 列的方案数(nlil)(mrjr)

考虑 用 ci 个颜色占领 il 行 jr 列的方案数 怎么算

我们考虑 gi,j,k 表示用 k 个颜色占领 il 行, jr 列的方案数
问题转化为计算 g 数组
再转化一下

对于一个 i×j 的矩阵, 要求每一行每一列至少要填上一个数, 总共填了 k 个数的方案数

怎么做捏? 好像很典
首先转化成「恰好」类型的问题

对于一个 i×j 的矩阵, 恰好有 i 行填了颜色, 恰好有 j 列填了颜色, 恰好填了 k 个数的方案数

考虑用「选择」类问题的方式, 逐渐拆开限制
以下都保证恰好填了 k 个颜色
首先令 f(x,y) 表示对于一个 x×y 的矩阵, 恰好有 x 行填了颜色, 恰好有 y 列填了颜色, 令 φ(x,y) 表示对于一个 x×y 的矩阵, 至多有 x 行填了颜色, 恰好有 y 列填了颜色 , 令 ψ(x,y) 表示对于一个 x×y 的矩阵, 至多有 x 行填了颜色, 至多有 y 列填了颜色

开演
容易发现

ψ(x,y)=i=0y(yi)φ(x,i)φ(x,y)=i=0y(1)yi(yi)ψ(x,i)φ(x,y)=i=0x(xi)φ(i,y)f(x,y)=i=0x(1)xi(xi)φ(i,y)

更显然的, ψ(x,y)=(x×yk)

为了写代码化简一下

φ(x,y)=i=0y(1)yi(yi)(xik)f(x,y)=i=0x(1)xi(xi)j=0y(1)yj(yj)(ijk)

结束了

总结

一类转移系数需要使用特殊方法解决的题目
注意使用二项式反演之前至少要转化成「恰好」形式

常见的填色 trick

「选择」类问题的特色:

  • 限制等价
  • 「恰好」转「至多 / 至少」
posted @   Yorg  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探
more_horiz
keyboard_arrow_up light_mode palette
选择主题
点击右上角即可分享
微信分享提示