DOJ logoDOJ
题目
最近添加的题目收藏的题目Workbooks
分类DLC比赛小组团队讨论区
排名
解题数量排行榜连续解题排名DOJ Power 排行榜
评测状态
征题登录注册
DOJ logoDOJ

支持 OI 子任务计分、Elo 等级分和 Discord 认证的社区在线评测系统。

题目
题目列表分类
社区
比赛排名讨论区公告举办外部比赛指南
账号
登录注册评测状态
政策
服务条款DLC 使用规则隐私政策API 文档语言运行环境比赛排名奖励评级与表现
© 2026 DOJ
保留所有权利
题解

WhiteBlue

返回题目

题解

将每一列表示为一个 NNN 位二进制掩码,其中位 000 表示白色,位 111 表示蓝色。

首先,仅保留不存在纵向连续三个相同位的列掩码。设这些掩码组成集合 VVV,其大小为 KKK。由于 N≤8N\le 8N≤8,有 K≤68K\le 68K≤68。每列选用的掩码还必须与该列所有已涂色的格子相符。

判断横向条件时,只需记住最近两列。设 dp[a][b]dp[a][b]dp[a][b] 表示已处理部分的最后两列掩码分别为 a,ba,ba,b 的合法方案数。添加新列掩码 ccc 时,要求每一行对应的 a,b,ca,b,ca,b,c 三个位不全相同。满足条件时,把 加到 中。所有结果都对 取模。

如果 M=1M=1M=1,直接统计第一列允许的掩码数。否则,用前两列所有允许的掩码对初始化 DP,再依次处理后面的列,最终将全部状态相加。

生成纵向合法掩码需要 O(N2N)O(N2^N)O(N2N) 时间,检查与预先涂色格子的一致性需要 O(MNK)O(MNK)O(MNK) 时间,DP 需要 O(MK3)O(MK^3)O(MK 时间。预处理转移时空间复杂度为 。每次加法只会相加两个已经取模的数,因此不会超出有符号32位整数范围。

dp[a][b]dp[a][b]
dp[a][b]
next[b][c]next[b][c]next[b][c]
1 000 000 0071\,000\,000\,0071000000007
3
)
O(K3+MK+K2)O(K^3+MK+K^2)O(K3+MK+K2)
Solution written by GPT6