计算在网格上着色方块的方法

时间:2015-01-12 12:17:31

标签: math combinatorics

在做其他事情时,我遇到了以下问题:

  

有一个 R 行和 C 列的网格。计算对这些方块的 B 进行着色的方式,以便每列都有偶数个有色方块。输出答案模10 ^ 9 + 7 。您可以假设 B甚至 R> = B

我能想到的最好的是O(RB ^ 2 + CB)。该方法是一个简单的DP,其中状态是[您要着色的列,要留下多少个正方形颜色],并且递归涉及在此列中选择您想要着色的方块数。

1 个答案:

答案 0 :(得分:2)

以下是使用生成函数查看此内容的方法。

对具有偶数个彩色方块的列着色方式的生成函数(多项式)是

a(x) = 1 + (R choose 2)x^2 + (R choose 4)x^4 + ...

您正在尝试计算(x)^ C中x ^ B的系数。你的方法是计算a(x),a(x)^ 2,a(x)^ 3的x ^ B项,...基本上是通过在每一步中乘以前几个项来计算。

通过连续平方计算a(x)^ C应该是一种改进:计算a(x)^ 2 ^ k的k值到log_2 C,然后将二进制扩展中对应的值相乘例如,如果C = 100 = 1100100_2,则计算a(x),a(x)^ 2,a(x)^ 4,... a(x)^ 64然后

a(x)^100 = a(x)^64 * a(x)^32 * a(x)^4.

这会占用更多内存,但如果这是一个问题,你可以计算^ 1,a ^ 2,a ^ 3,a ^ 6,a ^ 12,a ^ 24,a ^ 25,a ^ 50 ,a ^ 100,以便在每一步你方形或乘以a来计算^(前缀1100100_2)。

您可以更好地使用特定形式a(x)=((1 + x)^ R +(1-x)^ R)/ 2,比如应用二项式定理,但我没有让这种方法更快。