[JZOJ4391] 装饰

本文探讨了在给定约束条件下,如何通过算法计算特定网格染色方案的数量,涉及染色限制、相邻网格颜色限制以及每2×2网格内颜色种类的限制。通过转换为1×M状态,并利用组合数学方法计算合法方案数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description

给定2×M的网格,每个网格可以染red, green, blue三种颜色之一,
并有三个限制。

  1. 最后要有R个红色,G个绿色,B个蓝色。

  2. 相邻网格不能染相同的颜色。

  3. 每个2×2的网格要包含三种颜色。

求合法的染色方案数,答案对109+7取模。

Constraint

M,R,GB106

Analysis

2×M的网格状态太多,我们把它转换成1×M的状态,
Ai为第i列没有染上的颜色,根据第3个限制,可以得到Ai,Ai+1不能相同,
根据第2个限制,确定了A序列,整个染色情况就确定了,
但开头XY可以变成YX,所以最后答案要乘上2
那么现在我们计算A的合法方案数。

枚举开头的颜色及个数,设个数为X,会把序列分成XX1段,设分成的段数为g
那么这g段中,若一个段有偶数个位置,它会交替的放剩下两种颜色,
而一个段若有奇数个位置,该段开头的颜色将会多放一个。
g段中有e段是偶数段,则奇数段有ge段,
剩下两种颜色总数为Y,Z,在奇数段中开头的个数分别为oY,oZ,我们设出方程组,
解出oY,oZ。首先oY+oZ是所有的奇数段,然后剩下的YoY,ZoZ放在偶数段
(奇数段放了开头也变成偶数段)中,因为放了一个另一个就要交替的放,所以个数要相同。

{oY+oZYoY=ge=ZoZ

最后答案的形式是

(ge)(geoY)2e(YoYe+g1g1)

首先选出偶数段,然后奇数段中选择Y开头的,然后每个偶数段中开头有两种情况,
考虑到段里非空,所以Y先分配出去了oY+e个,然后挡板分配到g段里,
因为剩下的Z要交替放在Y旁边(偶数段就后面,奇数段就前面),
所以Z不用计算组合数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值