我有3个有效值:a、b、c
我可以将它们插入Nx3网格,这样就不会有行或列包含相同值的单元格。如何计算可以使用N行创建的有效模式数
例如,如果N=4,则有效模式的总数为296490。
这是我的尝试:
def countPatterns(n):
dp1, dp2 = 6,6
mod = 10 ** 9 + 7
for i in range(2, n+1):
dp1, dp2 = (dp1 * 3 + dp2 * 2) % mod, (dp1 * 2 + dp2 * 2) % mod
return (dp1 + dp2) % mod
当N=4时,输出应该是174,但我得到54
Tags:
简短回答
这也可以通过数学方法解决,因此公式为:
24n-(9*8n-9*2n-18*3n+24)
长话短说
一,。条件:没有行包含相同的值
对于给定的行,有
3
种方法可以在每个单元格中设置颜色。因此,有3个3个=27个可能的组合。然而,在这些27
组合中,3
是GGG
、BBB
和RRR
。因此,必须排除它们,并且一行中的有效组合数为27 - 3 = 24
因此,具有n行的表的组合总数为24n
二,。条件:没有列包含相同的值
为了解决这种情况,我们可以计算所有“无效组合”,然后从总数中减去它们的数目(如前一节所述,总数为24n)
2.1无效组合
显然,
1
的组合数等于2
和3
。关于4
、5
和6
也可以注意到这一点如果我们把从
1
到7
的组合求和,那么我们将得到总数但是,很难单独计算(1)-(7),但更容易计算组合的数量,以便至少
k
列具有相同的值。一旦找到这些,我们将应用inclusion-exclusion principle来查找问题中提出的组合数2.1.1第一列具有相同的值
对于每一行,都有
8
组合,使得该行以R
开头:这意味着对于具有
n
的表,有8个组合,其中第一列由8
组成。其中,存在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
步骤的组合相加,我们将得到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{}和{}的组合数为3*2n+6*3n
6
和7
的组合数为3*2n+6*3n2.1.5每列中的值等于
这意味着所有行必须相等。因为只有
24
在构造行的方法中,有24
种方法可以使列中的所有值相等。所以,它是24无效个案总数
如前所述,如果我们将2.1.1、2.1.2和2.1.3相加,那么我们将计算
4
、5
和6
两次,7
-3
次(从2.1)。由于每对列的组合数相同,我们只需减去3*2n+6*2n3
次(从2.1.4开始),然后将三列的组合数相加一次(因为减法后不会出现)9*8n-3*(3*2n+6*3n)+24=9*8n-9*2n-18*3n+24
三,。最终答案
现在,只需从24例中减去无效病例数:
24n-(9*8n-9*2n-18*3n+24)
不要忘记在最后应用109+7的模运算
这可以用组合学的标准技术来解决
相关问题 更多 >
编程相关推荐