当前位置: 首页 > news >正文

【2 月小记】Part 3: CROI-R3 比赛总结 - L

CROI-R3 比赛总结

T1

T2

T3

题意

给你一个 \(2 \times n\) 的网格,需要填充以下五种砖块:

  • \(1 \times 1\) 的小砖块
  • 四种旋转的 L 型砖块(每种覆盖 \(3\) 个格子)

\(m\) 个格子已经被预先填充,不能再用砖块覆盖。要求计算填充剩余格子的方案数。结果对 \(10^9+7\) 取模。

考点

状压 DP、矩阵快速幂

简析

由于砖块最多跨越两列,我们可以按列处理,只需要关注当前列和下一列的情况。而且,填充第 \(i\) 列时,只需要知道第 \(i-1\) 列的填充状态和第 \(i\) 列的预先填充情况

不妨定义 \(dp_{i, st}\) 表示处理到第 \(i\) 列,且第 \(i\) 列的填充状态为 \(st\) 时的方案数。其中 \(st\)\(2\) 位二进制数,第 0 位表示第一行是否已被填充,第 1 位表示第二行是否已被填充。

对于每一列,我们需要考虑:

  • 该列哪些格子已被预先填充;

  • 从前一列继承的未完成填充会对状态转移有什么影响(由状态 \(st\) 表示);

  • 方案数怎么转移。

不妨设 \(b_0\) 表示第 \(i\) 列第一行是否被预先填充,\(b_1\) 表示第 \(i\) 列第二行是否被预先填充。

我们知道,如果某个位置已被预先填充,那么它不能再用砖块覆盖,且在状态 \(st\) 中,该位置必须标记为已填充。

因此,对于当前列 \(i\),其从上一列继承的状态 \(st\) 表示哪些位置是 L 型砖块延伸到这一列的部分。这就说明,我们需要填充的是既没有被预先填充,也没有被继承状态覆盖的位置。

然后分类讨论四种状态的转移情况即可。过于繁杂,不予演示。

这种做法对于 \(n \le 10^5\) 是可行的,但对于 \(n \le 10^{18}\) 完全不可行。

接着我们注意到,在没有预先填充格子的连续区间内,状态转移是齐次的。这意味着:如果连续 \(k\) 列都没有预先填充的格子,那么它们的转移矩阵是相同的。

先设状态向量。容易知道,对于没有预先填充的列,存在一个 4×4 的转移矩阵。

对于一般情况,转移矩阵取决于:当前列的预先填充情况、下一列的预先填充情况、是否是最后一列。

可以定义一个函数 get_T(b0, b1, nb0, nb1, last)

  • b0, b1:当前列第一行、第二行是否已预先填充
  • nb0, nb1:下一列第一行、第二行是否已预先填充
  • last:当前列是否是最后一列

这个函数返回一个 4×4 矩阵,其中 mt[st1][st2] 表示从状态 st2 转移到状态 st1 的方案数。

对于没有任何预先填充的列,其无填充状态的转移矩阵 mt 为:

从 / 到 00 01 10 11
00 1 0 0 1
01 1 0 0 0
10 1 0 0 0
11 1 1 1 2

解释:

  • 从任何状态都可以转移到 00:用两个 1×1 填充当前列
  • 从状态 00 可以转移到 11:用 L 型砖块有两种方式
  • 从状态 00 可以转移到 01:用覆盖当前列和下一列的 L 型
  • 从状态 00 可以转移到 10:用另一种覆盖当前列和下一列的 L 型

所以我们需要分段处理,在处理关键列时,使用特殊的转移矩阵,在处理连续的无填充列时,使用矩阵快速幂加速。

http://www.jsqmd.com/news/358800/

相关文章:

  • 国内科研必备:16个Google和谷歌学术镜像站,2026最新更新
  • 集成灶的噪音大不大?揭秘静音真相+选购攻略|厨房宁静指南 - 匠言榜单
  • yolo姿态估计的板端算力占用评估
  • 如何选择合适的IP查询工具?精准度与更新频率全面分析
  • QMdiArea多窗口管理容器。官方demo,搜素mdi。复制,剪切,粘贴
  • QMimeData 是 Qt 中数据交换的标准化载体。粘贴复制,跨应用的标准格式。也能自定义数据类型
  • 2026年我会推荐哪些IP归属地查询网站?
  • 《梦断代码》——软件项目的理想与现实
  • 《人月神话》中的项目管理陷阱与启示
  • 外贸站必备!WordPress经销商地图,多国家适配+自动检索,省爆客服力!
  • 当内容遇冷之后:系统化运营如何激活短视频生命力 - 品牌之家
  • 【取模】思源黑体 取模只显示一部分问题,或者挤在一起
  • Excel分类汇总完全指南:从数据分析到分页打印的专业应用
  • 历史课不再枯燥!老师用什么AI工具做历史人物生平教学视频?横评 3 类神器,这款让学生抢着听课
  • 直流无刷电机,直径38mm,径向长23.8mm,转速25000rpm,功率200W
  • 嵌入式Linux:线程同步(读写锁) - 教程
  • 运用 HTML5 Canvas 实现可交互的内容瀑布流(隐藏式运维模式)
  • 《一文搞懂PyTorch优化器:SGD/Adam原理、使用流程与实战调优指南》
  • 本科生必看!万众偏爱的AI论文网站 —— 千笔ai写作
  • 救命神器!AI论文平台 千笔写作工具 VS 知文AI,专为本科生量身打造!
  • 一遍搞定全流程!专科生专属AI论文神器 —— 千笔·专业论文写作工具
  • 单例模式管理模型客户端的几种实现方式
  • OpenClaw 最新保姆级飞书对接指南教程 搭建属于你的 AI 助手
  • 4.6 显存和缓存
  • Flutter for OpenHarmony:音律尺 - 基于Flutter的Web友好型节拍器开发与节奏可视化实现
  • Flutter for OpenHarmony:跨平台虚拟标尺实现指南 - 从屏幕测量原理到完整开发实践
  • Typora绘制-甘特图
  • Flutter for OpenHarmony:语桥 - 基于Flutter的离线多语言短语速查工具实现与国际化设计理念
  • 20. new关键字
  • Flutter for OpenHarmony:绿氧 - 基于Flutter的呼吸训练应用开发实践与身心交互设计