【GDOI 2016模拟3.16】装饰

题目描述

以以下规则,用红蓝绿三种颜色填充一个 2×n 的表格。

  • 相邻的格子颜色不能相同。有公共边的格子就被视为是相邻的了。
  • 每个 2×2 的格子内,每种颜色都至少要出现一次。

答案对 109+7 取模

n106


分析

首先这个约束是非常紧的。
考虑将它取反,也就是说求出每一列没出现的颜色,排成一行,对应的每种颜色 ci 的数量变成 ncntci
那么两行的信息,就可以通过这一列反色的信息,以及两行开头一列的排列顺序确定下来。

对应的,因为 2×2 方格内不能有缺失,所以反串也不能有连续相同的颜色。

那么我们先填充开头的颜色,记它的数量为 x ,于是整个序列就会被划分成若干段空白,当最后一位被选了,空白段数就是x1,否则就是 x ,记它为cnt
其中有一部分是奇数的,一部分是偶数的。
枚举一下有多少段是奇数的,记为 odd ,那么偶数段数就可以算出来,是 cntodd 。而且选取的方案数也可以通过组合数算出来,也就是 (cntodd)

首先剩下两种颜色的数量不妨记为 y,z ,设 y<z ,并且必须要有 oddzy
首先 z 要在某几个奇数中比y多出现一次,先排除掉,然后多余的 odd(zy) 需要两两分配,也就是总共要从 odd 个中选出 odd(zy)2 y 多的,共贡献(oddodd(zy)2)
那么剩下的 y 就和剩下的 z 数量一样了,都是 yodd(zy)2
那么剩下的 y z必须成对出现,每个段中至少要有一对 yz ,而 odd 不一定要有, cntodd 一定要有,用挡板问题算出贡献为 yodd(zy)2+odd1cnt1

最后的最后,因为偶数段无论是两者谁开头都可以,所以还要再乘上一个 2cntodd
至此,问题就基本解决了。

时间复杂度 O(n)
空间复杂度 O(n)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值