简答
这也可以用数学方法求解,所以公式为:
24n - (9 * 8n - 9 * 2n - 18 * 3n + 24)
def countPatterns(n):
result = 24**n - (9 * 8**n - 9*2**n - 18*3**n + 24)
mod = 10 ** 9 + 7
return result % mod
print (countPatterns(4))
296490
长答案
1。条件:没有行包含相同的值
对于给定的行,有3 方法可以在每个单元格中设置颜色。因此,有 33=27 种可能的组合。但是,在这些27 组合中,3 是GGG、BBB 和RRR。因此,必须排除它们,并且一行中的有效组合数为27 - 3 = 24。
因此,n 行表的组合总数为 24n
2。条件:没有一列包含相同的值
为了解决这种情况,我们可以统计所有“无效组合”,然后从总数中减去它们的数量(如上一节所述,为 24n)。
2.1 无效组合
- 只有第一列具有相同的值。
- 只有第二列具有相同的值。
- 只有第三列具有相同的值。
- 只有前 2 列具有相同的值(第一列中的值不一定等于另一列)。
- 只有最后 2 列具有相同的值。
- 只有第一列和最后一列具有相同的值。
- 每列中的值相等。
显然,1 的组合数等于2 和3。 4、5 和 6 也是如此。
如果我们将1 到7 的组合相加,那么我们将得到总数。
但是,很难单独计算 (1)-(7),但更容易计算组合的数量,以使至少 k 列具有相同的值。找到这些组合后,我们将应用inclusion-exclusion principle 来查找问题中提出的组合数量。
2.1.1 第一列具有相同的值
对于每一行,都有8 组合,因此该行以R 开头:
RRG
RRB
RGR
RGG
RGB
RBR
RBG
RBB
这意味着对于带有n 的表,有 8n 种组合,其中第一列由8s 组成。其中,有3*8n种组合,第一列从R、G或B开始。
现在,重要的是要意识到这个数字代表 4 无效案例 - 1、4、6 和 7(包含第一列的所有列集)。
2.1.2 第二列具有相同的值
基本上,我们可以用和上面一样的逻辑来实现它也是3*8n。
这代表2、4、5 和7。
2.1.3 第三列具有相同的值
和以前一样 - 3*8n.
这包括3、5、6 和7。
如果我们将这些 3 步骤的组合相加,我们将得到 9*8n。但是,如这些步骤中所述,我们将计算 4、5 和 6 两次。 7 将被计算三次。
2.1.4 2列具有相同的值
让我们计算2 第一列的数量,因为每对列的数量仍然相同。
如果一行以2 相同的颜色开头,则每种颜色都有2 组合。如果不是,则每对都有3 组合(有6 可能的对)。因此,组合的总数为 3 * 2n + 6 * 3n。
因此,4 和 7 的组合数为 3 * 2n + 6 * 3n。
5 和 7 的组合数为 3 * 2n + 6 * 3n。
6 和 7 的组合数为 3 * 2n + 6 * 3n。
2.1.5 每列内的值相等
这意味着所有行必须相等。由于只有24 方法可以构造一行,所以有24 方法可以使列内的所有值相等。所以,它是 24。
无效案例总数
如前所述,如果我们将2.1.1、2.1.2和2.1.3相加,那么我们将计数@987654378 @、5 和 6 两次,7 - 3 次(来自 2.1)。由于每对列的组合数相同,我们只需减去 3 * 2n + 6 * 2n @987654383 @times(从 2.1.4 开始),然后将三列 case 的组合数相加一次(因为减法后就不存在了)。
9 * 8n - 3 * (3 * 2n + 6 * 3n) + 24 = 9 * 8n - 9 * 2n - 18 * 3n + 24
3。最终答案
现在,只需从 24n 中减去无效案例的数量:
24n - (9 * 8n - 9 * 2n - 18 * 3n + 24)
不要忘记在最后应用 109 + 7 的模运算。